在XHR中寻找真正需要的信息-- --爬取QQ音乐歌曲清单(1)

我们在用xpath或者bs爬取网页的时候经常会遇到这么一个问题:明明xpath或者bs写对的呀,为什么爬出来是个空值呢?这种问题我遇到过两种情况,第一种是xpath不对,浏览器会自动优化网页源码的xpath,这时候就需要手写xpath了(或者删去所得的xpath中的tbody试试。)第二种情况就是动态加载的网页啦~就比如咱们QQ音乐的网站:https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰伦
当我们用chrome打开这个网址,并分析其中的元素的时候,似乎轻而易举地得到了歌曲名地xpath//*[@class=‘js_song’]
或者用bs来写,代码如下:

import requests
from bs4 import  BeautifulSoup
res_music = requests.get('https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC%A6')
bs_music = BeautifulSoup(res_music.text,'html.parser')
list_music = bs_music.find_all('a',class_='js_song')
for music in list_music:
    print(music['title'])
    # 打印出我们想要的音乐名码片`

但是真正运行代码的时候你就会发现啥都爬不下来哦,因为这个网页是动态加载的,使用了Ajax
那么,要怎么才能找到我们的歌曲清单呢?
别急,我们打开chrome浏览器,输入上面的网址,跳转到QQ音乐,然后右键点击检查,选择Network,在查询框中输入周杰伦,回车
可以看见,加载出来好多好多东西。
在这里插入图片描述

可见,浏览器一共发送了70个请求哦,当我们点开第一个请求,再点击respons,会看见这个请求的源代码。然后你就会惊异地发现,其中的内容与requests.get得到的文本内容一致
这说明什么呢,说明我们使用requests.get只能得到所有请求中的第一个,但是请求总共有70个呢,而我们所需要的歌曲清单就在其中。
点击Network中的XHR(我们需要的内容一般都在XHR内),一个一个往下翻,终于,我们翻到了带有歌曲清单的请求
在这里插入图片描述
点击headers,里面有它该请求的url。所以,我们真正需要请求的是这个url
第一步,使用requests.get这个请求中的URL,得到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&notice=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为键,查找歌曲名
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值