ajax抓取网页内容( get()和post(两个)方法设置相关的参数)
优采云 发布时间: 2021-12-03 06:25ajax抓取网页内容(
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_ENCODING和DEFAULT_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的和标签,默认值为False
first:是否只查找第一个网页元素,默认值为False即查找全部元素
_encoding:设置编码格式,默认值为None
# 定义
xpath(selector,clean,first,__encoding)
# 参数说明
selector:使用Xpath Selector定位网页元素
containing:字符串类型,默认值为None,通过特定文本查找网页元素
clean:是否清除HTML的和标签,默认值为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 Selector和Xpath 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 文件夹也命名为fixed,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请求慢,但是可以大大降低开发难度。
声明:本站所有文章,如无特殊说明或注释,均在本站发布原创。任何个人或组织,未经本站同意,不得复制、盗用、采集、将本站内容发布到网站、书籍等任何媒体平台。本站内容侵犯了原作者的合法权益,您可以联系我们进行处理。
小君比常任还帅