爬虫库Requests-HTML简介及安装 数据清洗、Ajax动态数据抓取

鳄鱼君

发表文章数:591

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » 爬虫库Requests-HTML简介及安装 数据清洗、Ajax动态数据抓取

Requests-HTML简介

Requests-HTML是在Requests的基础上进一步封装,两者都是由同一个开发者开发。Requests-HTML除了包含Requests的所有功能之外,还新增了数据清洗Ajax数据动态渲染

● 数据清洗,由lxmlPyQuery模块实现,这两个模块分别支持XPath Selectors和CSS Selectors定位,通过XPathCSS定位,可以精准地提取网页里的数据。

● Ajax数据动态渲染,将网页的动态数据加载到网页上再抓取。网页数据可以使用Ajax向服务器发送HTTP请求,再由JavaScript完成数据渲染,如果直接向网页的URL地址发送HTTP请求,并且网页的部分数据是来自Ajax,那么,得到的网页信息就会有所缺失。而Requests-HTML可以将Ajax动态数据加载到网页信息,无需爬虫开发者分析Ajax的请求信息。

Requests-HTML安装

Requests-HTML的安装可使用pip指令:pip install requests-html,Requests-HTML只支持Python 3.6以上的版本。

Requests-HTML使用

Requests-HTML向网站发送请求的方法是来自Requests模块,但是Requests-HTML只能使用Requests的Session模式,该模式是将请求会话实现持久化,使这个请求保持连接状态。Session模式好比我们在打电话的时候,只要双方没有挂断电话,就会一直保持一种会话(连接)状态。

Session模式对HTTP的GETPOST请求也是由get()和post()方法实现,具体的使用方法如下:

from requests_html import HTMLSession
# 定义会话Session
session=HTMLSession()
# 发送GET请求
res=session.get(url)
# 发送POST请求
res=session.post(url,data={})
# 打印网页的URL地址
print(res.html)

由于get()和post()方法都来自Requests模块,因此还可以对这两个方法设置相关的参数,如请求参数、请求头、Cookies、代理IP以及证书验证等。

Requests-HTML在请求过程中还做了优化处理,如果没有设置请求头,Requests-HTML就会默认使用源码里所定义的请求头以及编码格式。

找到Requests-HTML的源码文件:\Lib\site-packages\requests_html.py,里面定义了属性DEFAULT_ENCODINGDEFAULT_USER_AGENT,分别对应编码格式和HTTP的请求头。

DEFAULT_ENCODING = 'utf-8'
DEFAULT_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'
from requests_html import HTMLSession
# 定义会话列表
session=HTMLSession()
url='https://y.qq.com/portal/singer_list.html'
# 发送GET请求
res=session.get(url)
# 使用Chromium浏览器加载网页
res.html.render()
# 定位歌手名字
singer=res.html.find('li.singer_list__item div h3 a')
print(singer)

数据清洗

Requests-HTML不仅优化了请求过程,还提供了数据清洗的功能,而Requests模块只提供请求方法,并不提供数据清洗,这也体现了Requests-HTML的一大优点。使用Requests开发的爬虫,数据清洗需要调用其他模块实现,而Requests-HTML则将两者结合在一起。

Requests-HTML提供了各种各样的数据清洗方法,比如网页里的URL地址HTML源码内容文本信息等,代码参考:

from requests_html import HTMLSession
# 定义会话列表
session=HTMLSession()
url='https://www.e1yu.com/'
# 发送GET请求
res=session.get(url)
# 输出网页里的URL地址
print(res.html,'')
# 输出网页里全部URL地址
print(res.html.links)
# 输出网页里精准的URL地址
print(res.html.absolute_links)
# 输出网页的HTML信息
print(res.text)
# 输出网页的全部文本信息,即去除HTML代码
print(res.html.text)

代码只是提取了网站的基本信息,如果想要精准地提取某个数据,可以使用find()、xpath()、search()和search_all()方法实现。首先了解这4种方法的定义及相关的参数说明:

# 定义
find(selector,containing,clean,first,_encoding)
# 参数说明
selector:使用CSS Selector定位网页元素
containing:字符串类型,默认值为None,通过特定文本查找网页元素
clean:是否清除HTML的<script>和<style>标签,默认值为False
first:是否只查找第一个网页元素,默认值为False即查找全部元素
_encoding:设置编码格式,默认值为None

# 定义
xpath(selector,clean,first,__encoding)
# 参数说明
selector:使用Xpath Selector定位网页元素
containing:字符串类型,默认值为None,通过特定文本查找网页元素
clean:是否清除HTML的<script>和<style>标签,默认值为False
first:是否只查找第一个网页元素,默认值为False即查找全部元素
_encoding:设置编码格式,默认值为None

# 定义
search(template)
# 参数说明
template:通过元素内容查找第一个元素

# 定义
search_all(template)
# 参数说明
template:通过元素内容查找全部元素

这里以鳄鱼君Ba的网站为例进行说明,提取网页的文章标题:

from requests_html import HTMLSession
# 定义会话列表
session=HTMLSession()
url='https://www.e1yu.com/'
# 发送GET请求
res=session.get(url)

# 通过CSS Seletor定位标题
# first:True获取第一个元素
print(res.html.find('div.excerpt-post header h2 a',first=True).text)
# 输出当前标签的属性
print(res.html.find('div.excerpt-post header h2 a',first=True).attrs)
print('————————分割线1————————')

# 查找特定文本的元素
# 如果元素所在的HTML里含有containing的属性值即可提取
for name in res.html.find('h2 a',containing='R'):
    # 输出内容
    print(name.text,'\n',name.attrs)
print('————————分割线2————————')

# 通过Xpath Selector定位
for name in res.html.xpath('//h2/a'):
    print(name.text,'\n',name.attrs)
print('————————分割线3————————')

# 通过search查找
# 一个{ }代表一个内容,内容可为中文或者英文等
print(res.html.search('爬虫库Requests-HTML简介及{}{}'))
# 通过search_all查找所有
print(res.html.search_all('爬虫库Requests-HTML{}{}{}{}{}'))

代码中的CSS SelectorXpath Selector语法不再详细介绍,自行补充学习!

Ajax动态数据抓取

使用Requests-HTML请求网页地址,相应的响应内容与开发者工具的Doc选项卡的响应内容是一致的。如果网页数据是通过Ajax请求并由JavaScript渲染到网页上,还需要使用Requests-HTML模拟Ajax请求来获取网页数据。

模拟Ajax请求,需要构建请求参数,请求参数的构建方式繁多而复杂,实现起来比较耗费时间。以QQ音乐的歌手列表页为例,每位歌手的名字都是由Ajax加载到网页上。

Requests-HTML提供了Ajax加载功能,加载后的网页信息与开发者工具的Elements选项卡的网页信息是一致的。这个加载功能是通过调用谷歌的Chromium浏览器实现的,

Chromium是谷歌为发展Chrome而开启的计划,它可以理解为Chrome的工程版或实验版,新功能都会率先在Chromium上实现,待验证后才会应用在Chrome上。

Ajax加载功能由render()方法实现,初次使用render()方法会自动下载Chromium浏览器,下载Chromium浏览器必须保证当前网络能正常访问谷歌首页,否则无法下载。此外,还可以直接下载Chromium浏览器,并将浏览器放置在C盘的用户文件夹

在文件路径中,只有“000”是变化的,不同的电脑有不同的命名;而chrome-win32文件夹的命名也是固定的,该文件夹里存放了Chromium浏览器的相关文件和应用程序。如果是通过下载方式就无需手动配置文件路径,Requests-HTML会将下载后的Chromium浏览器自动配置到相应的文件路径。

完成了Chromium浏览器配置,可以编写以下代码来实现Requests-HTML的Ajax加载功能:

from requests_html import HTMLSession
# 定义会话列表
session=HTMLSession()
url='https://y.qq.com/portal/singer_list.html'
# 发送GET请求
res=session.get(url)
# 使用Chromium浏览器加载网页
res.html.render()
# 定位歌手名字
singer=res.html.find('li.singer_list__item div h3 a')
print(singer)

虽然运行速度比模拟Ajax请求的速度较慢,但可以大大降低开发难度。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《爬虫库Requests-HTML简介及安装 数据清洗、Ajax动态数据抓取》 发布于2020-05-30

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

6 + 5 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册