大家好,今天是21天python打卡的第13天,上一篇讲了python中requests的用法,今天来说说requests-html的用法。

活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
目录
requests-html 模块安装使用 pip install requests-html 即可,官方手册查询地址:requests-html.kennethreitz.org/,官方并没有直接的中文翻译,在检索过程中,确实发现了一版中文手册,在文末提供。
先看一下官方对该库的基本描述:
- Full JavaScript support!(完全支持 JS,这里手册还重点标记了一下,初学阶段可以先忽略)
- CSS Selectors (a.k.a jQuery-style, thanks to PyQuery).(集成了 pyquery 库,支持 css 选择器)
- XPath Selectors, for the faint at heart.(支持 XPath 选择器)
- Mocked user-agent (like a real web browser).(mock UA 数据,这点不错)
- Automatic following of redirects.(自动跟踪重定向)
- Connection–pooling and cookie persistence.(持久性 COOKIE)
- The Requests experience you know and love, with magical parsing abilities.
Only Python 3.6 is supported. 仅支持 Python 3.6 ,实测发现 3.6 以上版本依旧可以。
对于该库的简单使用,代码如下所示:
- from requests_html import HTMLSession
- session = HTMLSession()
-
- r = session.get('https://python.org/')
-
- print(r)
首先从 requests_html 库导入 HTMLSession 类,然后将其实例化之后,调用其 get 方法,发送请求,得到的 r 输出为 ,后续即可使用内置的解析库对数据进行解析。
由于该库是解析 html 对象,所以可以查看对应的 html 对象包含哪些方法与与属性。
dir 函数查阅- print(dir(r.html))
- # 输出如下内容:
- ['__aiter__', '__anext__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
- '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__',
- '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
- '__weakref__', '_async_render', '_encoding', '_html', '_lxml', '_make_absolute', '_pq', 'absolute_links', 'add_next_symbol',
- 'arender', 'base_url', 'default_encoding', 'element', 'encoding', 'find', 'full_text', 'html', 'links', 'lxml', 'next',
- 'next_symbol', 'page', 'pq', 'raw_html', 'render', 'search', 'search_all', 'session', 'skip_anchors', 'text', 'url', 'xpath']
该函数只能输入大概内容,细节还是需要通过 help 函数查询,例如:
find:提供一个 css 选择器,返回一个元素列表;xpath:提供一个 xpath 表达式,返回一个元素列表;search: 根据传入的模板参数,查找 Element 对象;search_all:同上,返回的全部数据;
links:返回页面所有链接;absolute_links:返回页面所有链接的绝对地址;base_url:页面的基准 URL;html,raw_html,text:以 HTML 格式输入页面,输出未解析过的网页,提取页面所有文本;
有了上述内容铺垫之后,在进行 Python 爬虫的编写就会变的容易许多,requests-html 库将通过 3~4 个案例进行学习掌握,接下来进入第一个案例。
安装requests-html
pip install requests-html
基本使用
学过requests库的同学看到requests-html的api应该会很熟悉,使用方法基本一致,不同的是使用requests编写爬虫时,要先把网页爬取下来,然后再交给Beautiful Soup等一些html解析库,现在可以直接解析了,下面我们通过小案例来感受一下
- from requests_html import HTMLSession
-
- session = HTMLSession()
-
- def parse():
- r = session.get('http://www.qdaily.com/')
- # 获取首页新闻标签、图片、标题、发布时间
- for x in r.html.find('.packery-item'):
- yield {
- 'tag': x.find('.category')[0].text,
- 'image': x.find('.lazyload')[0].attrs['data-src'],
- 'title': x.find('.smart-dotdotdot')[0].text if x.find('.smart-dotdotdot') else x.find('.smart-lines')[0].text,
- 'addtime': x.find('.smart-date')[0].attrs['data-origindate'][:-6]
- }
通过简短的几行代码,就可以把整个首页的文章抓取下来,下面我来分别介绍一下案例中使用的几个方法
ind( ) 可以接收两个参数
- 第一个参数可以是class名称或ID
- 第二个参数first=True时,只选取第一条数据
text 获取元素的文本内容
attrs 获取元素的属性,返回值是个字典。如:
{'class': ('smart-date',), 'data-origindate': '2018-11-02 10:27:10 +0800'}
此外还支持xpath选择器,使用方法也很简单
- r.html.xpath('/html/body/div[2]/div[1]/div[2]/div/div[3]')[0].text
-
- '登录\n登录查看你的好奇心指数'
高级用法
对 JavaScript的支持无疑是requests-html最大的亮点,上篇文章分享Python爬虫实战——搭建自己的IP代理池时,我们就遇到这样一个问题,代理的端口号都是js渲染的,我们不得不去分析他们的加密方式,然后再来解密,虽然最后也能成功解密,但是费时费力,现在使用requests-html我们可以轻松解决这个问题。
下面我们来演示一下使用方法
- from requests_html import HTMLSession
- from re
- session = HTMLSession()
-
- def parse():
- r = session.get('http://www.goubanjia.com')
- r.html.render()
-
- reg = re.compile('
|<.*?>' , re.S) - for x in r.html.find('.ip'):
- data = re.sub(reg, '', str(x.html))
- yield data
-
输出结果
def main():
for x in parse():
print(x)
# IP代理地址
103.212.236.5:80
103.31.45.106:23500
同样是简短的几行代码,和之前的破解js相比,真是大大提升了我们的爬虫效率,这里主要是用了render函数,我们来一起看一下它的源代码
- def render(self, retries: int = 8, script: str = None,
- wait: float = 0.2, scrolldown=False, sleep: int = 0,
- reload: bool = True, timeout: Union[float, int] = 8.0,
- keep_page: bool = False):
-
- """
- retries: 加载次数
- script: 页面加载时要执行的js脚步(可选).
- wait: 加载页面之前等待的秒数,防止超时 (可选).
- scrolldown: 页面向下滚动的次数
- sleep: 初始渲染后要等多长时间
- reload: 如果等于False,内容不会从浏览器加载,而是将从内存中加载.
- keep_page: 如果是True 将允许您通过``r.html.page`页面与浏览器进行交互.
今天就介绍到这里,下一篇我们继续介绍Beautiful Soup的基本用法。