ajax抓取网页内容( get()和post(两个)方法设置相关的参数)

优采云 发布时间: 2021-12-03 06:25

  ajax抓取网页内容(

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请求慢,但是可以大大降低开发难度。

  声明:本站所有文章,如无特殊说明或注释,均在本站发布原创。任何个人或组织,未经本站同意,不得复制、盗用、采集、将本站内容发布到网站、书籍等任何媒体平台。本站内容侵犯了原作者的合法权益,您可以联系我们进行处理。

  

  小君比常任还帅

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线