A-A+
动态爬虫神器 – requests_html Chromium渲染
今天凑时间研究了下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/目录下,如下图所示:
使用非常简单,只需要在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 网站为例,可以先利用浏览器查看网页源码:
从上图中可以看到,此网页内容主要为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)
输出:
然后加上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)
输出:
可以看到网页上的内容被动态渲染出来了,简直方便。
异步
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/
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏