python爬取网页network_网页爬取时执行状态成功,但获取不到想要的数据的时候解决方法(Network,XHR,json)...

Network:

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

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

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

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

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

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

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

什么是XHR?

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

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

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

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

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

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

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

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

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

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

这里的URL就是该信息的链接!

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

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

json:

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

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

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

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对应的就是歌曲名字

运行结果:

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

你可能感兴趣的:(python爬取网页network_网页爬取时执行状态成功,但获取不到想要的数据的时候解决方法(Network,XHR,json)...)