天天看点

爬虫库(Requests-HTML)Requests-HTML简述Requests-HTML安装请求方式数据清洗

爬虫库(Requests-HTML

  • Requests-HTML简述
  • Requests-HTML安装
  • 请求方式
  • 数据清洗

Requests-HTML简述

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

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

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

Requests-HTML安装

windows系统下,cmd命令行:pip install requests-html

温馨提示:仅支持python3.6以上版本

验收是否安装成功:

爬虫库(Requests-HTML)Requests-HTML简述Requests-HTML安装请求方式数据清洗

请求方式

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

from requests_html import HTMLSession

# 定义会话Session
session = HTMLSession()
url = 'https://movie.douban.com/'
# 发送GET请求
r = session.get(url)
# 发送POST请求
r = session.post(url, data={})
# 输出网页的url地址
print(r.html)
           

执行结果:

爬虫库(Requests-HTML)Requests-HTML简述Requests-HTML安装请求方式数据清洗

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

Requests-HTML在请求过程中还做了优化处理,如果没有设置请求头,Requests-HTML就会默认使用源码里所定义的请求头以及编码格式。在Python的安装目录下打开Requests-HTML的源码文件(\Lib\site-packages\requests_html.py),定义了属性DEFAULT_ENCODING和DEFAULT_USER_AGENT,分别对应编码格式和HTTP的请求头

数据清洗

Requests-HTML不仅优化了请求过程,还提供了数据清洗的功能,而Requests模块只提供请求方法,并不提供数据清洗,这也体现了Requests-HTML的一大优点。使用Requests开发的爬虫,数据清洗需要调用其他模块实现,而Requests-HTML则将两者结合在一起。Requests-HTML提供了各种各样的数据清洗方法,比如网页里的URL地址、HTML源码内容、文本信息等,使用方法如下所示:

from requests_html import HTMLSession

# 定义会话Session
session = HTMLSession()
url = 'https://movie.douban.com/'
# 发送GET请求
r = session.get(url)
# 输出网页的url地址
print(r.html)

# 输出网页里全部的url地址
print(r.html.links)

# 输出网页里精准的url地址
print(r.html.absolute_links)

# 输出网页的HTML信息
print(r.text)

# 输出网页的文本信息,即去除HTML代码
print(r.html.text)



           

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

爬虫库(Requests-HTML)Requests-HTML简述Requests-HTML安装请求方式数据清洗

实例:

以豆瓣

爬虫库(Requests-HTML)Requests-HTML简述Requests-HTML安装请求方式数据清洗

电影名在标签〈li class=“title”〉里,评分在标签〈li class=“rating”〉里,因此上述4种定位方法的使用如下所示:

from requests_html import HTMLSession

# 定义会话Session
session = HTMLSession()

url = "https://movie.douban.com/"
# 发送GET请求
r = session.get(url)

# 通过CSS Selector定义li元素,".title"代表class属性
# first=True代表获取第一个元素
print(r.html.find('li.title', first=True).text)
# 输出当前标签的属性值
print(r.html.find('li.title', first=True).attrs)

print("________分割线________")
# 查找特定文本元素
# 如果元素所在的HTML里含有containing的属性值即可提取
for name in r.html.find('li.title', containing="多力特的奇幻"):
    # 输出电影名
    print(name.text)
print("________分割线________")

# 查找全部电影名
for name in r.html.find("li.title"):
    # 输出电影名
    print(name.text)
    # 输出电影名所在标签的属性值
    print(name.attrs)
print("________分割线________")

# 通过Xpath Selector定位ul标签
x = r.html.xpath('//*[@id="screening"]/div[2]/ul/li[6]/ul')
for name in x:
    print(name.text)
print("________分割线________")
# search()通过关键字查找内容
# 一个{}代表一个内容,内容可为中文或英文等
print(r.html.search("多力特的奇幻..."))
print("________分割线________")
# search_all()通过关键字查询整个网页符合的内容
print(r.html.search_all("大话西游{}{}"))