动态爬虫神器-requests_html初探

会在何处见到你,莫非前尘已注定

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

模块下载安装

1
pip install requests-html

注意目前只支持python3.6版本

模块基础用法

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

其他response方法

1
2
3
4
5
6
7
8
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方法:

1
2
3
4
5
6
7
8
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动态渲染而来,我们先尝试不用动态渲染的方式获取网页源码

1
2
3
4
5
6
7
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方法

1
2
3
4
5
6
7
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同样支持异步,具体使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> 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
说明:关于requests_html模块暂时没有研究太多,日后用到了再补充!!!

nmask wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!

热门文章推荐: