二 安装
安装requests-html非常简单,一行命令即可做到。需要注意一点就是,requests-html只支持Python 3.6或以上的版本,所以使用老版本的Python的同学需要更新一下Python版本了。
#pip3 install requests-html
三 如何使用requests-html?
在我们学爬虫程序的时候用得最多的请求库就是requests与urllib,但问题是这些包只给我们提供了如何去目标站点发送请求,然后获取响应数据,接着再利用bs4或xpath解析库才能提取我们需要的数据。
以往爬虫的请求与解析
而在requests-html里面只需要一步就可以完成而且可以直接进行js渲染!requests的作者Kenneth Reitz 开发的requests-html 爬虫包 是基于现有的框架 PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装,作者将Requests的简单,便捷,强大又做了一次升级。
requests-html和其他解析HTML库最大的不同点在于HTML解析库一般都是专用的,所以我们需要用另一个HTTP库先把网页下载下来,然后传给那些HTML解析库。而requests-html自带了这个功能,所以在爬取网页等方面非常方便。
1、基本使用
from requests_html import HTMLSession# 获取请求对象
session=HTMLSession()
# 往新浪新闻主页发送get请求
sina=session.get('https://news.sina.com.cn/')
# print(sina.status_code)
sina.encoding="utf-8'
# 获取响应文本信息,与requests无区别
print(sina.text)
2、获取链接(links与abolute_links)
links返回的结果absolute_links返回的结果
from requests_html import HTMLSession# 获取请求对象
session=HTMLSession()
# 往京东主页发送get请求
jd=session.get('https://jd.com/')
# 得到京东主页所有的链接,返回的是一个set集合
print(jd.html.links)
print('*' * 1000)
# 若获取的链接中有相对路径,我们还可以通过absolute_links获取所有绝对链接
print(jd.html.absolute_links)
3、CSS选择器与XPATH
request-html支持CSS选择器和XPATH两种语法来选取HTML元素。首先先来看看CSS选择器语法,它需要使用HTML的find函数来查找元素。
''' CSS选择器 and XPATH 1.通过css选择器选取一个Element对象 2.获取一个Element对象内的文本内容 3.获取一个Element对象的所有attributes 4.渲染出一个Element对象的HTML内容 5.获取Element对象内的特定子Element对象,返回列表 6.在获取的页面中通过search查找文本 7.支持XPath 8.获取到只包含某些文本的Element对象'''view code
四 支持JavaScript
支持JavaScript是我觉得作者更新后最为牛逼的一个地方,但是需要在第一次执行render的时候下载chromeium,然后通过它来执行js代码。
1、render的使用
from requests_html import HTMLSessionsession=HTMLSession()
url="http://www.win4000.com/'
obj=session.get(url)
obj.encoding="utf-8'
obj.html.render()
注意:第一次运行render()方法时,它会将Chromium下载到您的主目录中(例如~/.pyppeteer/)。这种情况只发生一次。
2、 下载Chromeium问题
因为是从国外的站点下载几分钟才3%,实在是太慢了。所以我们需要通过国内的镜像去下载!需要做以下几步:
手动下载Chrome
先去国内源下载自己需要的版本,地址:https://npm.taobao.org/mirrors/chromium-browser-snapshots/
修改chromeium_downloader.py文件
下载后之后解压后,进入python安装目录下的\Lib\site-packages\pyppeteer目录, 并打开chromium_downloader.py文件。
View Code
五 自定义User-Agent
有些网站会使用User-Agent来识别客户端类型,有时候需要伪造UA来实现某些操作。如果查看文档的话会发现上的很多请求方法都有一个额外的参数,这个参数用来向底层的请求传递额外参数。我们先向网站发送一个请求,看看返回的网站信息。
from requests_html import HTMLSession# pprint可以把数据打印得更整齐from pprint import pprintimport jsonget_url="http://httpbin.org/get'session=HTMLSession()
# 返回的是当前系统的headers信息
res=session.get(get_url)
pprint(json.loads(res.html.html))
# 可以在发送请求的时候更换user-agent
ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'
post_url="http://httpbin.org/get'
res=session.get(post_url, headers={'user-agent': ua})
pprint(json.loads(res.html.html))
# 如果你有需要可以在header中修改其他参数。
六 模拟表单提交(POST)
一整套的HTTP方法,包括get、post、delete等, 对应HTTP中各个方法。
# 表单登录r=session.post('http://httpbin.org/post', data={'username': 'tank_jam', 'password': 'tank9527'})pprint(json.loads(r.html.html))''' # 打印结果{'args': {}, 'data': '', 'files': {}, 'form': {'password': 'tank9527', 'username': 'tank_jam'}, 'headers': {'Accept': '**', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) ' 'AppleWebKit/603.3.8 (KHTML, like Gecko) ' 'Version/10.1.2 Safari/603.3.8'}, 'origin': '110.18.237.233', 'url': 'http://httpbin.org/get'}可以看到UA是requests-html自带的UA,下面换一个UA:
ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'r=session.get('http://httpbin.org/get', headers={'user-agent': ua})pprint(json.loads(r.html.html))
可以看到UA确实发生了变化:
{'args': {}, 'headers': {'Accept': '**', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Content-Length': '29', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) ' 'AppleWebKit/603.3.8 (KHTML, like Gecko) ' 'Version/10.1.2 Safari/603.3.8'}, 'json': None, 'origin': '110.18.237.233', 'url': 'http://httpbin.org/post'}如果有上传文件的需要,做法也是类似的。如果了解过requests库的同学可能对这里的做法比较熟悉,没有错,这其实就是requests的用法。requests-html通过暴露的方法,让我们可以对请求进行定制,将额外参数直接传递给底层的requests方法。所以如果有什么疑问的话,直接去看requests文档就好了。