先看下这个包的新特性:
手动敲黑板)划重点,要考,必考内容!!!
全面支持解析JavaScript!
CSS 选择器 (jQuery风格, 感谢PyQuery).
XPath 选择器, for the faint at heart.
自定义user-agent (就像一个真正的web浏览器).
自动追踪重定向.
连接池与cookie持久化.
令人欣喜的请求体验,魔法般的解析页面.
接触过爬虫用的最多的包无非就是requests, urllib包,我们再使用这些包的时候显示,用requests包去获取响应,然后再利用pyquery或者bs4,xpath再去整理提取我们需要是目标数据。也就是下面两步:
import requests
from pyquery import PyQuery as pq
#获取网页
html = requests.get()
#解析网页
doc = pq(html)
但是!!!!!!
在requests-html里面只需要一步就可以完成而且可以直接进行js渲染!!!
requests的作者Kenneth Reitz 开发的requests-html 爬虫包 是基于现有的框架 PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装,作者将Requests的简单,便捷,强大又做了一次升级。这里是github地址
下面看下这个非常强大的工具。注意这里只在python3.6以上使用
安装
pip install requests-html
使用教程
GET请求网址JD网站:
from requests_html import HTMLSession
#启动
session = HTMLSession()
#获取
jd= session.get('https://www.jd.com/')
# 获取网页内的所有链接
link_list = jd.html.links
# 获取页面上所欲偶的链接,以绝对路径的方式
ab_link_list = jd.html.absolute_links
在交互环境下测试,输出结果太多我们简单截取一部分
这是.links返回的结果,结果是一个set类型数据
{'//a.jd.com/',
'//anzhuang.jd.com',
'//art.jd.com',
...
'//z.jd.com/',
'//z.jd.com/sceneIndex.html?from=jrscyn_20162'}
这是绝对路径返回的结果,同样的是set类型,但是自动添加了协议,更加方便的取到连接
{'https://a.jd.com/',
'https://anzhuang.jd.com',
'https://art.jd.com',
'https://b.jd.com/',
'https://baby.jd.com',
'https://baitiao.jd.com',
...
'https://z.jd.com/',
'https://z.jd.com/sceneIndex.html?from=jrscyn_20162'}
获取对象
它封装了很多解析库,所以很多用法得到了保留,先看下下面的使用demo:
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://search.jd.com/Search?keyword=x1&enc=utf-8&wq=x1&pvid=add52cb63f7e4887b5ba29406a5756ba')
link_list = r.html.find('.gl-item')
for i in link_list:
print(i.text)
结果如下:
¥13999.00
联想ThinkPad
X1
Carbon 2018(0JCD)14英寸轻薄笔记本电脑(i7-8550U 8G 512GSSD 背光键盘 FHD)黑色
1.5万+条评价
自营
对比 关注 加入购物车
广告
¥9999.00
.....
相信通过上面你已经看出来了上面使用的是css选择器,我们介绍几个常用的使用方法。关于css选择的用法可以参考以前的一篇文章爬虫解析库--pyquery以及css选择器的使用或者查看网站教程请移步这里了解更多
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://python.org/')
- 通过css选择器选取一个Element对象
node = r.html.find('#about', first=True') #里面是css选择器内容
- 获取一个Element对象内的文本内容
node_text = node.text
- 获取一个Element对象的所有attributes
node_attrs = node.attrs
- 渲染出一个Element对象的HTML内容:
node_html = node.html
- 获取Element对象内的特定子Element对象,返回列表:
node.find('a')
- 在获取的页面中查找文本
node.html.search('something{}something')[0] # 这个大括号里面是相当于替代的词类似于正则里的.也就是所有匹配可以设定开头和结尾中间的大括号里的内容也就是我们想要取出来的文字
- 同时也支持XPath
node.html.xpath('a')
- 你也可以获取到只包含某些文本的Element对象
node.html.find('a', containing='something')
下面就是重磅炸弹了!!!高能预警!!!
支持JavaScript
r = session.get('http://python-requests.org/')
r.html.render()
pirnt(r.html.search('Python 2 will retire in only {months} months!')['months'])
注意,当你第一次调用render()方法时,代码将会自动下载Chromium,并保存在你的家目录下(如:~/.pyppeteer/)。它只会下载这一次。
还有正在开发的智能分页系统这里还没有完善不过多介绍
- 不使用Requests库 你不需要Requests库也可以使用requests-html
from requests_html import HTML
doc = """<a href='https://httpbin.org'>"""
html = HTML(html=doc)
print(html.links)
- 同样你不需要Requests库也可以渲染JavaScript页面
# ^^ 接上边代码继续 ^^
script = """
() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}
"""
val = html.render(script=script, reload=False)
print(val)
print(html.html)
比较实用的方法
- user_agent
requests_html.user_agent(style=None)
返回一个指定风格的合法的用户代理,默认是Chrome风格的用户代理
-
HTML Sessions
这些sessions用于构造http请求。
class requests_html.HTMLSession(mock_browser=True)
它是一个可被销毁的session,可用于cookie持久化和连接池,以及其他地方。