当我们的程序运行结果什么都找不到时,有两种情况:
1、 首先要确认自己的代码是否有问题。
确认的方法是:用print方法从下往上,倒推着一步一步排查:看提取是不是出错,看解析是不是出错,看请求是不是出错。
2、 网页源代码里没有我们想要的数据?
确认的方法是:翻找Network。
有一些比较老(或比较轻量)的网站,会直接把所有的关键信息都放在第0个请求(当下刚刚完成的请求)里,我们用requests和BeautifulSoup就能解决它们。否则,就需要用到Network。
什么是Network
用途:
Network的功能是:记录在当前页面上发生的所有请求。
Network记录的是实时网络请求。
我们点击一下刷新,浏览器会重新访问网络,这样就会有记录。
Network怎么用
红色的圆钮是启用Network监控(默认高亮打开),灰色圆圈是清空面板上的信息。右侧勾选框Preserve log,它的作用是“保留请求日志”。如果不点击这个,当发生页面跳转的时候,记录就会被清空。
主要功能:
ALL(查看全部)
XHR(仅查看XHR,一种不借助刷新网页即可传输数据的对象)
Doc(Document,第0个请求一般在这里)
Img(仅查看图片)
Media(仅查看媒体文件)
Other(其他)
JS和CSS是前端代码,负责发起请求和页面实现
Font是文字的字体
什么是XHR?
是Network中一类非常重要的请求,当把鼠标在XHR上悬停,可以看到它的完整表述是XHR and Fetch。
用浏览器上网时经常有这样的情况:浏览器上方访问的网址没变,但是网页里却新加了内容。如购物网站,下滑自动加载出更多商品。这是Ajax技术。这种技术在工作的时候,会创建一个XHR(或是Fetch)对象,然后利用XHR对象来实现服务器和浏览器之间传输数据。
如今,比较新潮的网站都在使用这种技术来实现数据传输。只剩下一些特别老,或是轻量的网站还在用老办法——加载新的内容,必须要跳转一个新网址。
XHR怎么请求?
使用前提:
当我们要找的东西不在网页源代码(res.text)里,而且也不是图片,不是媒体文件,自然只会是在XHR里。
首先,寻找可能存放的文件名称
1、 点击XHR,寻找最大的数据(通常我们要的东西都含有较大的数据量)
2、 或者试着去阅读XHR或是Fetch文件名称,比如,client_search(意思是客户端搜索)
其次,点击开这个文件查看寻找
Headers:标头(请求信息)
Preview:预览
Response:响应
Cookies:Cookies
Timing:时间
点击Preview(预览),找对的话能在里面发现我们想要的信息就藏在里面!(有时需要一层一层展开)
最后,拿到这个文件(定义文件位置)
那如何把这些文件拿到呢?
1、去最左侧的Headers。第0个General,General里的Requests URL就是我们应该去访问的链接。
2、回到原网址,直接用Preview来看,顺序展开后列表和字典在此有非常清晰的结构。
XHR是一个字典,字典里可以套字典,字典里也可以套列表。其中对应我们要找的文件名。
json是什么?
用途:
使用res.text取到的,是字符串。它不是我们想要的列表/字典,因此数据取不出来。这时候,需要把response对象转成列表/字典(把response对象转成字符串的方法是res.text)——用json来实现。我们可以将json格式的数据,转换成正常的列表/字典,也可以将列表/字典转换成json。
定义:
在Python语言当中,json是一种特殊的字符串,这种字符串特殊在它的写法——它是用列表/字典的语法写成的。
举例:
a = '1,2,3,4'# 这是字符串
b = [1,2,3,4]# 这是列表
c = '[1,2,3,4]'# 这是字符串,但它是用json格式写的字符串
这种特殊的写法决定了,json能够有组织地存储信息。json是另一种组织数据的格式,长得和Python中的列表/字典非常相像。它和html一样,常用来做网络数据传输。在XHR里查看到的列表/字典,严格来说其实它不是列表/字典,它是json。
json和XHR之间的关系:
XHR用于传输数据,它能传输很多种数据,json是被传输的一种数据格式。
json数据如何解析?
方法:
请求到数据之后,使用json()方法即可成功读取。接下来的操作,就和列表/字典相一致。
举例说明:
import requests# 引用requests库
res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')# 调用get方法,下载这个字典
json_music = res_music.json()# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']# 一层一层地取字典,获取歌单列表
for music in list_music:# list_music是一个列表,music是它里面的元素
print(music['name']) # 以name为键,查找歌曲名
网友评论