A-A+

动态爬虫神器 – requests_html Chromium渲染

2020年12月21日 14:38 汪洋大海 暂无评论 阅读 279 views 次

今天凑时间研究了下requests_html模块,它是requests模块作者开发的另一款爬虫神器。此模块主要结合了xpath网页源码获取功能,以及pyppeteer网页动态渲染功能。后者方便我们获取js动态渲染的源代码,而前者方便从源代码中获取想要的内容。

模块下载安装

pip install requests-html

注意目前只支持python3.6版本
模块基础用法

from requests_html import HTMLSession
url  = "http://sec.didichuxing.com/present"
session = HTMLSession()
r = session.get(url)
print(r.html.html)  # 输出网页源码

其他response方法

print(r.html.url) # 输出当前url
print(r.html.links) # 输入页面中的link(原生样式)
print(r.html.absolute_links) # 输入页面中的link(绝对链接)
print(r.html)
print(r.html.text) # 输出源码中的字符
print(r.html.html) # 输出源码
print(dir(r.html)) # 输入所有方法,可查看所有response方法

动态渲染页面
requests-html模块提供了render()方法,用于动态渲染网页。当第一次执行render方法时,会自动下载Chromium(无头浏览器)到~/.pyppeteer/目录下,如下图所示:

动态爬虫神器 - requests_html Chromium渲染

使用非常简单,只需要在response中调用render方法:

from requests_html import HTMLSession
url  = "http://sec.didichuxing.com/present"
session = HTMLSession()
r = session.get(url)
r.html.render() # 动态渲染页面
print(r.html.html) # 输出源码

实例演示
这里以http://sec.didichuxing.com/present 网站为例,可以先利用浏览器查看网页源码:

动态爬虫神器 - requests_html Chromium渲染

从上图中可以看到,此网页内容主要为js动态渲染而来,我们先尝试不用动态渲染的方式获取网页源码

from requests_html import HTMLSession
url  = "http://sec.didichuxing.com/present"
session = HTMLSession()
r = session.get(url)
# r.html.render() # 动态渲染页面
print(r.html.html)

输出:

动态爬虫神器 - requests_html Chromium渲染

 

然后加上render方法

from requests_html import HTMLSession
url  = "http://sec.didichuxing.com/present"
session = HTMLSession()
r = session.get(url)
r.html.render() # 动态渲染页面
print(r.html.html)

输出:

动态爬虫神器 - requests_html Chromium渲染

 

可以看到网页上的内容被动态渲染出来了,简直方便。

异步
request_html同样支持异步,具体使用方法:

>>> from requests_html import AsyncHTMLSession
>>> asession = AsyncHTMLSession()
>>> async def get_pythonorg():
...     r = await asession.get('https://python.org/')
...     return r
...
>>> async def get_reddit():
...    r = await asession.get('https://reddit.com/')
...    return r
...
>>> async def get_google():
...    r = await asession.get('https://google.com/')
...    return r
...
>>> results = asession.run(get_pythonorg, get_reddit, get_google)
>>> results # check the requests all returned a 200 (success) code
[<Response [200]>, <Response [200]>, <Response [200]>]
>>> # Each item in the results list is a response object and can be interacted with as such
>>> for result in results:
...     print(result.html.url)
...
https://www.python.org/
https://www.google.com/
https://www.reddit.com/

更多使用文档,请移步:https://github.com/psf/requests-html
文章来源:https://nmask.cn/2019/08/16/2/

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言