Reuqests-html
requests 作者开发,集成 pyppeteer。
最近爬虫遇到的情况是,爬取的网站使用JavaScript
渲染的,网站爬取的结果只有一堆JS
代码。之前遇到这种情况的处理办法是用Splash
(一般是配合Scrapy),或者Selenium
来爬取,介绍一下常用的模拟浏览器执行,来爬去js
渲染页面的方法。
方法 | 介绍 |
---|---|
Selenium | 驱动Chrome、Firefox等浏览器爬取 |
Splinter | 依赖于Selenium、Flask |
Spynner | 依赖于PyQt |
pyppeteer | puppetter的Python版本 |
Splash | 常与Scrapy配合使用 |
requests-html | requests作者开发,集成pyppeteer |
安装
pip install requests-html
基本使用
支持的特性
个人感觉最大的特点就是完整的JavaScrapt支持和异步支持。因为Requests
不支持异步,之前使用异步请求的时候使用的是aiohttp
(链接)和Python
中的协程(链接)配合使用。
- 完整的JavaScript支持
- CSS Selectors 选择
- XPath Selectors
- 模拟用户代理
- 自动跟踪链接重定向
- 链接池和cookie持久特性
- 异步支持
获取页面
非异步
之前解析库都是专门的模块支持,我们需要把网页下载下来,然后传给
HTMl
解析库,而Requests-html
自带这个功能,在爬取页面十分方便。
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://news.qq.com/')
print(response.html.html) # 获取页面内容
异步获取
自带异步请求方法
from requests_html import AsyncHTMLSession
from requests_html import HTMLSession
session = HTMLSession()
asession = AsyncHTMLSession()
async def get_qq():
r = await asession.get('http://news.qq.com/')
async def get_toutiao():
r = await asession.get('https://www.toutiao.com/')
result = session.run(get_qq, get_toutiao) # 目前下载的版本并没有该功能
获取链接
links和absolute_links两个属性分别返回HTML对象所包含的所有链接和绝对链接(均不包含锚点):
response.html.links()
response.html.absolute_links()
获取元素
支持CSS和XPATH两种语法来选取HTML元素。
CSS选择器
def find(self, selector: str = "*", *, containing: _Containing = None, clean: bool = False, first: bool = False, _encoding: str = None)
- selector:要用的CSS选择器
- clean:是否清理已发现的
<script>
和<style>
标签的HTML。 - contaning:返回该属性文本的标签
- first:True 返回第一个元素,否则返回满足条件的元素列表。
- _encoding:编码格式
Xpath选择器
xpath(self, selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None)
- selector:要用的XPATH选择器
- clean:是否清理已发现的
<script>
和<style>
标签的HTML。 - first:True 返回第一个元素,否则返回满足条件的元素列表。
- _encoding:编码格式
元素内容
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://news.qq.com/')
print(response.html.xpath('//*[@id="subHot"]/h2/a/text()')[0])
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://news.qq.com/')
# print(response.html.xpath('//*[@id="subHot"]/h2/a/text()')[0])
print(response.html.search('美国{}个人')[0]) # 在页面搜索文字
JavaScript支持
就是在HTML结果上调用一下render函数,它会在用户目录(默认是~/.pyppeteer/)中下载一个chromium,然后用它来执行JS代码。
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://www.zhihu.com/topic/19552832/hot')
response.html.render() # 不调用该方法无法获取标题
print(response.html.xpath('//*[@id="root"]/div/main/div/div[1]/div[1]/div[1]/div/div/div/div[2]/h2/div'))
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:Flase页面不会从浏览器中加载,而是从内存中加载
- keep_page:True 允许你用
r.html.page
访问页面
爬取知乎页面,并且模拟下滑页面。
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://www.zhihu.com/topic/19552832/hot')
response.html.render(scrolldown=4,sleep=5)
for name in response.html.xpath("//h2[@class='ContentItem-title']/a/text()"):
print(name)
结果
如何用 Python 和 fast.ai 做图像深度迁移学习?
【Python】动手分析天猫内衣售卖数据,得到你想知道的信息!
60行代码爬取知乎神回复
【数据分析】手把手用Python教你分析运筹学薪资状况
我的python学习之路
Python中的格式化输出字符串
python中调用matlab
翻译 | 更快的Python(二)
[Pipeline] 在Anaconda下用Snakemake构建ChIP-seq流程(1)
数学推导+纯Python实现机器学习算法1:线性回归
什么人适合学习Django, 如何学习Django以及需要学习到什么程度可以找到工作?
Python入门向:Matplotlib自救指南篇,从此做图不求人(一)
Python系列——一笔画问题的算法研究
Python中的文件读写(二)
python 分析泰坦尼克号生还率
一个Tor代理绕过访问限制的典型案例
[ERROR] Snakemake的几个报错
异步请求
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://www.zhihu.com/topic/19552832/hot')
await response.html.arender()
不带请求
from requests_html import HTML
doc = """<a href='https://httpbin.org'>"""
html = HTML(html=doc)
html.links
{'https://httpbin.org'}