python 爬虫获取不到正文 爬虫xhr的数据无法获取_json


Network:

当我们爬取网页的内容,对源代码进行请求,响应的源代码中没有我们需要的东西时,需要查看Network

打开需要爬取的网页,进行源码检查,会发现左边框框里的是Elements,右边框框是我们需要关注的Network

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_02

python 爬虫获取不到正文 爬虫xhr的数据无法获取_json_03

Network 的功能是:记录在当前页面上所发生的所有请求(它是实时加载的,如果是空的,则需要刷新网页)

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_04


在图最下面显示,此处有16个请求,15.4kb的流量,耗时3.14s

python 爬虫获取不到正文 爬虫xhr的数据无法获取_json_05


python 爬虫获取不到正文 爬虫xhr的数据无法获取_Network_06


其实这里的第一个,就是刚requests.get()获取到的网页源代码,它里面不包含歌曲清单。

一般来说,都是这种第0个请求先启动了,其他的请求才会关联启动,一点点地将网页给填充起来。也有一些网页,直接把所有的关键信息都放在第0个请求里,尤其是一些比较古老(或比较轻量)的网站,我们用requestsBeautifulSoup就可以解决他们。

我们要做的就是找到这些信息藏在哪个请求当中,并用requests库,去模拟这个请求。

python 爬虫获取不到正文 爬虫xhr的数据无法获取_Network_07

python 爬虫获取不到正文 爬虫xhr的数据无法获取_python 爬虫获取不到正文_08

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_09

什么是XHR?

在Network中,有一类非常重要的请求叫做XHR(当你把鼠标在XHR上悬停,你可以看到它的完整表述是XHR and Fetch)

我们平时使用浏览器上网的时候,经常有这样的情况:浏览器上方,它所访问的网址没变,但是网页里却新加了内容。

典型代表:如购物网站,下滑自动加载出更多商品。在线翻译网站,输入中文实时变英文。

这个,叫做Ajax技术(技术本身和爬虫关系不大)。应用这种技术,好处是显而易见的——更新网页内容而不用重新加载整个网页。又省流量又省时间的,何乐而不为。

如今,比较新潮的网站都在使用这种技术来实现数据传输。只剩下一些特别老,或是特别轻量的网站,还在用老办法——加载新的内容,必须要跳转一个新网址。

这种技术在工作的时候,会创建一个XHR(或是Fetch)对象,然后利用XHR对象来实现,服务器和浏览器之间传输数据。在这里,XHR和Fetch并没有本质区别,只是Fetch出现得比XHR更晚一些,所以对一些开发人员来说会更好用,但作用都是一样的。

显而易见,对照前面的表单。我们的歌曲清单不在网页源代码里,而且也不是图片,不是媒体文件,自然只会是在XHR里。我们现在去找找看,点击XHR按钮。

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_10


client_search : 客户端搜索(这里里面的就是客户端输入搜索出的信息)

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_11

点击preview 就可以看到我们需要的信息:

python 爬虫获取不到正文 爬虫xhr的数据无法获取_Network_12

再点击旁边的Headers就可以看到该信息的链接:

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_13


这里的URL就是该信息的链接!但是我们把这个链接用浏览器搜索的话会看到很多东西:(头疼)

python 爬虫获取不到正文 爬虫xhr的数据无法获取_Network_14

其实就是很多字典嵌套字典!!!!(老虎吃天,没处下嘴)

json:

以前用res.text()来把response对象转换成字符串,json就是把response对象转换成字典\列表

json是数据格式,可以有效有组织的存储信息

json则是另一种组织数据的格式,长得和Python中的列表/字典非常相像。它和html一样,常用来做网络数据传输。刚刚我们在XHR里查看到的列表/字典,严格来说其实它不是列表/字典,它是json。

python 爬虫获取不到正文 爬虫xhr的数据无法获取_数据_15

json和XHR之间的关系:XHR用于传输数据,它能传输很多种数据,json是被传输的一种数据格式。就是这样而已。

import requests
#引用requests库
url='网页链接'
res_music=requests.get('url')
#调用get()方法,下载这个字典
json_music=res_music.json()
#使用json方法,将response对象,转为列表\字典
list_music=json_music['data']['song']['list']
#一层一层地取字典,获取歌单列表
for music in list_music:
	print(music['name'])
	#这里name对应的就是歌曲名字

运行结果:

python 爬虫获取不到正文 爬虫xhr的数据无法获取_Network_16

XHR的功能是传输数据,其中有非常重要的一种数据是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,在Python语言当中,我们把它称为字符串。我们能够非常轻易地将json格式的数据转化为列表/字典,也能将列表/字典转为json格式的数据。

python 爬虫获取不到正文 爬虫xhr的数据无法获取_Network_17