【web自动化测试】requests-html 这个解析库,能让你更轻松的获取网页内容

1. 开始

Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就不大习惯,很久之前就知道 Reitz 大神出了一个叫 Requests-HTML 的库,一直没有兴趣看,这回可算歹着机会用一下了。

使用 pip install requests-html安装,上手和 Reitz 的其他库一样,轻松简单:

 from requests_html import HTMLSession session = HTMLSession() ? r = session.get(‘https://www.python.org/jobs/‘)

这个库是在 requests 库上实现的,r 得到的结果是 Response 对象下面的一个子类,多个一个 html 的属性。所以 requests 库的响应对象可以进行什么操作,这个 r 也都可以。如果需要解析网页,直接获取响应对象的 html 属性:

 r.html

2. 原理

不得不膜拜 Reitz 大神太会组装技术了。实际上 HTMLSession 是继承自 requests.Session 这个核心类,然后将 requests.Session 类里的 requests 方法改写,返回自己的一个 HTMLResponse 对象,这个类又是继承自 requests.Response,只是多加了一个 _from_response 的方法来构造实例:

 class HTMLSession(requests.Session):     # 重写 request 方法,返回 HTMLResponse 构造     def request(self, *args, **kwargs) -> HTMLResponse:         r = super(HTMLSession, self).request(*args, **kwargs)         return HTMLResponse._from_response(r, self)
 class HTMLResponse(requests.Response):     # 构造器     @classmethod     def _from_response(cls, response, session: Union[‘HTMLSession‘, ‘AsyncHTMLSession‘]):         html_r = cls(session=session)         html_r.__dict__.update(response.__dict__)         return html_r

之后在 HTMLResponse 里定义属性方法 html,就可以通过 html 属性访问了,实现也就是组装 PyQuery 来干。核心的解析类也大多是使用 PyQuery 和 lxml 来做解析,简化了名称,挺讨巧的。

3. 元素定位

元素定位可以选择两种方式:

css 选择器

  • css选择器
  • xpath
 # css 获取有多少个职位 jobs = r.html.find("h1.call-to-action") # xpath 获取 jobs = r.html.xpath("//h1[@class=‘call-to-action‘]")

方法名非常简单,符合 Python 优雅的风格,这里不妨对这两种方式简单的说明:

4. CSS 简单规则

  • 标签名 h1
  • id 使用 #id 表示
  • class 使用 .class_name 表示
  • 谓语表示:h1[prop=value]

5. Xpath简单规则

  • 路径 // 或者 /
  • 标签名
  • 谓语 [@prop=value]
  • 轴定位 名称::元素名[谓语]

定位到元素以后势必要获取元素里面的内容和属性相关数据,获取文本:

 jobs.text jobs.full_text

获取元素的属性:

 attrs = jobs.attrs value = attrs.get("key")

还可以通过模式来匹配对应的内容:

 ## 找某些内容匹配 r.html.search("Python {}") r.html.search_all()

这个功能看起来比较鸡肋,可以深入研究优化一下,说不定能在 github 上混个提交。

6. 人性化操作

除了一些基础操作,这个库还提供了一些人性化的操作。比如一键获取网页的所有超链接,这对于整站爬虫应该是个福音,URL 管理比较方便:

 r.html.absolute_links r.html.links ?

内容页面通常都是分页的,一次抓取不了太多,这个库可以获取分页信息:

 print(r.html) # 比较一下 for url in r.html:     print(url) ?

结果如下:

 # print(r.html) <HTML url=‘https://www.python.org/jobs/‘> # for <HTML url=‘https://www.python.org/jobs/‘> <HTML url=‘https://www.python.org/jobs/?page=2‘> <HTML url=‘https://www.python.org/jobs/?page=3‘> <HTML url=‘https://www.python.org/jobs/?page=4‘> <HTML url=‘https://www.python.org/jobs/?page=5‘> ?

通过迭代器实现了智能发现分页,这个迭代器里面会用一个叫 _next 的方法,贴一段源码感受下:

 def get_next():     candidates = self.find(‘a‘, containing=next_symbol) ?     for candidate in candidates:         if candidate.attrs.get(‘href‘):             # Support ‘next‘ rel (e.g. reddit).             if ‘next‘ in candidate.attrs.get(‘rel‘, []):                 return candidate.attrs[‘href‘] ?

通过查找 a 标签里面是否含有指定的文本来判断是不是有下一页,通常我们的下一页都会通过 下一页 或者 加载更多 来引导,他就是利用这个标志来进行判断。默认的以列表形式存在全局:[‘next‘, ‘more‘, ‘older‘]。我个人认为这种方式非常不灵活,几乎没有扩展性。感兴趣的可以往 github 上提交代码优化。

7. 加载 js

也许是考虑到了现在 js 的一些异步加载,这个库支持 js 运行时,官方说明如下:

Reloads the response in Chromium, and replaces HTML content
with an updated version, with JavaScript executed.

使用非常简单,直接调用以下方法:

 r.html.render() ?

第一次使用的时候会下载 Chromium,不过国内你懂的,自己想办法去下吧,就不要等它自己下载了。render 函数可以使用 js 脚本来操作页面,滚动操作单独做了参数。这对于上拉加载等新式页面是非常友好的。

8. 总结

Reitz 大神设计出来的东西还是一如既往的简单好用,自己不多做,大多用别人的东西组装,简化 api。真是够人性。不过有的地方还是优化空间,希望有兴趣和精力的童鞋去 github 上关注一下这个项目。

原文地址:https://www.cnblogs.com/wagyuze/p/11102270.html

时间: 2024-10-10 20:32:56

【web自动化测试】requests-html 这个解析库,能让你更轻松的获取网页内容的相关文章

Web 自动化测试与智能爬虫利器:PhantomJS 简介与实战

估计部分同学没听过这个工具,那先简单介绍下它的背景与作用. 1.PhantomJS 是什么? PhantomJS是一个基于WebKit的服务器端JavaScript API,它无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM 处理.JavaScript.CSS选择器.JSON.Canvas和可缩放矢量图形SVG.PhantomJS主要是通过JavaScript和CoffeeScript控制WebKit的CSS选择器.可缩放矢量图形SVG和HTTP网络等各个模块.Phan

Sahi ---实现 Web 自动化测试

Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具.Sahi 运行为一个代理服务器,并通过注入 JavaScript 来访问 Web 页面中的元素.Sahi 支持 HTTPS 并且独立于 Web 站点,简单小巧却功能强大.它相对于 Selenium 等自动化测试工具,在动态 ID 元素查找和隐式页面等待处理等方面具有一定的优势.选择 Sahi 工具来实现具体 Web 项目的自动化测试是一个很不错的选择. Web 测试背景 随着 Web 技术和互联网的发

使用 Sahi 实现 Web 自动化测试

Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具.Sahi 运行为一个代理服务器,并通过注入 JavaScript 来访问 Web 页面中的元素.Sahi 支持 HTTPS 并且独立于 Web 站点,简单小巧却功能强大.它相对于 Selenium 等自动化测试工具,在动态 ID 元素查找和隐式页面等待处理等方面具有一定的优势.选择 Sahi 工具来实现具体 Web 项目的自动化测试是一个很不错的选择. Web 测试背景 随着 Web 技术和互联网的发

爬虫智能解析库 Readability 和 Newspaper 的用法

舆情爬虫是网络爬虫一个比较重要的分支,舆情爬虫往往需要爬虫工程师爬取几百几千个新闻站点.比如一个新闻页面我们需要爬取其标题.正文.时间.作者等信息,如果用传统的方式来实现,每一个站点都要配置非常多的规则,如果要维护一个几百上千的站点,那人力成本简直太高了. 如果有一种方式可以在保证差不多的准确率的前提下,大幅提高提取效率的话,就需要用到智能文本提取了. 本文首先介绍一下智能文本提取的基本原理,让大家对智能提取有基本的了解.然后介绍几个比较基础的工具包,准确率并不是很高,可以尝试一用.最后再介绍几

uniVocity-parsers:一款强大的CSV/TSV/定宽文本文件解析库(Java)

uniVocity-parsers 是一个开源的Java项目. 针对CSV/TSV/定宽文本文件的解析,它以简洁的API开发接口提供了丰富而强大的功能.后面会做进一步介绍. 和其他解析库有所不同,uniVocity-parsers以高性能.可扩展为出发点,设计了一套自有架构.基于这套架构,开发者可以构建出新的文件解析器. 1. 概述 作为一名Java开发者,我目前正在参与开发一个Web项目,该项目帮助通信运营商评估当前的网络,并给出解决方案. 在该项目中,CSV文件扮演着至关重要的角色,它是运营

Web自动化测试工具调研

背景 Web自动化测试越来越被重视, 因为现在Web已经是工程化的状态. 如何通过工具测试, 保证Web开发的质量,提升开发效率,是Web工具的诞生的来由. Web测试分为以下几个方面: 1. 界面测试 测试界面是否正常,这是前端测试最基础的环节. 2. 功能测试 测试功能操作是否正常,由于涉及交互,这部分测试比界面测试会更复杂 3. 性能测试 页面性能越来越受到关注,并且性能需要在开发过程中持续关注,否则很容易随着业务迭代而下降. 4. 安全性测试 测试Web界面和WebServer的安全性,

DNS服务原理及区域解析库文件配置

一.DNS服务概述 DNS(Domain Name service或者Domain Name Server)中文名叫做域名服务或者域名服务器, 属于应用层协议, 为C/S架构, 使用TCP/UDP的53号端口. [[email protected] ~]# cat /etc/services | grep "^domain\b" domain 53/tcp # name-domain server domain 53/udp 1.1 DNS服务架构概览 DNS服务架构见下图: 从图中可

python3解析库lxml

lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高 XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索 XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串.数值.时间的匹配以及节点.序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择 XPath

第四部分 解析库的使用(XPath、Beautiful Soup、PyQuery)

在网页节点中,可以定义id.class或其他属性.节点间有层次关系,网页中要通过XPath或CSS选择器定位一个或多个节点.在页面解析时,可利用XPath或CSS选择器提取某个节点,再调用相应方法获取它的正文内容或者属性,就可提取到想要的信息.在python中常用的解析库有lxml.Beautiful Soup.pyquery等.使用这些库可以很大程度上提高效率. 一 使用XPath解析库 XPath,全称XML Path Language,即XML路径语言,是一门在XML文档中查找信息的语言.