一.重新分析过程
从QQ音乐搜索周杰伦的歌,打印所有歌名,代码可以写成如下:

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')
# 请求html,得到response
bs_music = BeautifulSoup(res_music.text,'html.parser')
# 解析html
list_music = bs_music.find_all('a',class_='js_song')
# 查找class属性值为“js_song”的a标签,得到一个由标签组成的列表
for music in list_music:
# 对查找的结果执行循环print(music['title'])# 打印出我们想要的音乐名

代码没有什么问题,但是得到的结果为空,这是为什么?
打印res_music,我们可以看到,网页源代码里根本没有我们想要的歌曲清单,那么问题到底出在哪里?
想要找到答案,我们需要学习——Network.
Network的功能是:记录在当前页面上发生的所有请求。
总之,为了成功抓取到歌曲清单。我们得先找到,歌名藏在哪一个请求当中。再用requests库,去模拟这个请求。

二.Network怎么用

第0行的左侧,红色的圆钮是启用Network监控(默认高亮打开),灰色圆圈是清空面板上的信息。右侧勾选框Preserve log,它的作用是“保留请求日志”。如果不点击这个,当发生页面跳转的时候,记录就会被清空。所以,我们在爬取一些会发生跳转的网页时,会点亮它。

第1行,是对请求进行分类查看。我们最常用的是:

All 查看全部
XHR 一种不借助刷新网页即可传输数据的对象
Doc Document,第0个请求一般在这里
Img 仅查看图片
Media 仅查看图片
Other 其他
JS和CSS 前端代码,负责发起请求和页面实现
Font 字体
WS和Manifest 网络编程相关知识

夹在第2行和第1行中间的,是一个时间轴。记录什么时间,有哪些请求。而第2行,就是各个请求,你可以看下面这张表来理解(读,但不需要记忆)。

name 名字
status 请求的状态
type 请求的类型(Doc/XHR/Img…)
size 数据的大小
time 请求的耗时
waterfall 瀑布流,用于描述每个请求的起止时间

在第3行,是统计:有多少个请求,一共多大,花了多长时间。

三.什么是XHR
在Network中,有一类非常重要的请求叫做XHR。
我们平时使用浏览器上网的时候,经常有这样的情况:浏览器上方,它所访问的网址没变,但是网页里却新加了内容。如购物网站,下滑自动加载出更多商品。
这个,叫做Ajax技术。应用这种技术,好处是显而易见的——更新网页内容,而不用重新加载整个网页。又省流量又省时间的,何乐而不为。
这种技术在工作的时候,会创建一个XHR对象,然后利用XHR对象来实现,服务器和浏览器之间传输数据。

这个网页里一共有10个XHR,我们要从里面找出带有歌单的那一个。
笨办法当然是一个一个实验,但聪明的办法是去尝试阅读它们的名字。比如你一眼就看到:client_search(客户端搜索)……而且它最大,有10.9KB,我们来点击它。


接着,我们可以在General中的Request URL中提取到数据的所有数据的URL,我们用requests.get去请求它。
然后我们可以一层层的找到歌名提取它。

import requests
res = 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方法,下载这个字典
print(res.text)
# 把它打印出来

结果:(截取了一小部分)

{“code”:0,“data”:{“keyword”:“周杰伦”,“priority”:0,“qc”:[],“semantic”:{“curnum”:0,“curpage”:1,“list”:[],“totalnum”:0},“song”:{“curnum”:75,“curpage”:1,“list”:[{“action”:{“alert”:41,“icons”:12861308,“msg”:13,“switch”:17405185},“album”:{“id”:8220,“mid”:“000MkMni19ClKG”,“name”:“叶惠美”,“pmid”:“000MkMni19ClKG_1”,“subtitle”:"",“title”:“叶惠美”,“title_hilight”:“叶惠美”},“chinesesinger”:0,“desc”:"",“desc_hilight”:"",“docid”:“4660176279196411288”,“file”:{“b_30s”:0,“e_30s”:60000,“media_mid”:“002202B43Cq4V4”,“size_128”:4317292,“size_128mp3”:4317292,“size_320”:10792516,“size_320mp3”:10792516,“size_aac”:6528081,“size_ape”:0,“size_dts”:0,“size_flac”:31430142,“size_ogg”:5864688,“size_try”:960887,“strMediaMid”:“002202B43Cq4V4”,“try_begin”:84339,“try_end”:142856},“fnote”:4009,“genre”:1,“grp”:[{“action”:{“alert”:2,“icons”:8404860,“msg”:14,“switch”:17413891},“album”:{“id”:9040723,“mid”:“004fXSyj3bWTMN”,“name”:“周杰伦地表最强世界巡回演唱会”,“pmid”:“004fXSyj3bWTMN_1”,“subtitle”:"",“title”:“周杰伦地表最强世界巡回演唱会”,“title_hilight”:“周杰伦地表最强世界巡回演唱会”},“chinesesinger”:0,“desc”:"",“desc_hilight”:"",“docid”:“17446851886596147438”,“file”:{“b_30s”:0,“e_30s”:60000,“media_mid”:“004Fs2FP1EvZYc”,“size_128”:3997591,“size_128mp3”:3997591,“size_320”:9993634,“size_320mp3”:9993634,“size_aac”:6051533,“size_ape”:0,“size_dts”:0,“size_flac”:30393796,“size_ogg”:5441651,“size_try”:960887,“strMediaMid”:“004Fs2FP1EvZYc”,“try_begin”:0,“try_end”:0},“fnote”:4009,“genre”:1,“id”:244115385,“index_album”:10,“index_cd”:0,“interval”:249,“isonly”:1,“ksong”:{“id”:6353070,“mid”:“003cFobf0Ps0EB”},“language”:0,“lyric”:"",“lyric_hilight”:"",“mid”:“004Fs2FP1EvZYc”,“mv”:{“id”:0,“vid”:""},“name”:“晴天”,“newStatus”:2,“nt”:537335406,“pay”:{“pay_down”:1,“pay_month”:1,“pay_play”:0,“pay_status”:0,“price_album”:0,“price_track”:200,“time_free”:0},“pure”:0,“singer”:[{“id”:4558,“mid”:“0025NhlN2yWrP4”,“name”:“周杰伦”,“title”:“周杰伦”,“title_hilight”:“周杰伦”,“type”:0,“uin”:0}],“status”:0,“subtitle”:"",“t”:1,“tag”:10,“time_public”:“2019-11-01”,“title”:“晴天
(Live)”,“title_hilight”:“晴天
(Live)”,“type”:0,“url”:“http://stream10.qqmusic.qq.com/244115385.wma”,“ver”:3,“volume”:{“gain”:-5.400000095367432,“lra”:2.276999950408936,“peak”:0.9470000267028809}},{“action”:{“alert”:2,“icons”:8404860,“msg”:14,“switch”:17413891},“album”:{“id”:14323,“mid”:“0032ezFm3F53yO”,“name”:“周杰伦
2004 无与伦比 演唱会 Live e_public”:“2019-11-01”,“title”:“告白气球
(Live)”,“title_hilight”:“告白气球
(Live)”,“type”:0,“url”:“http://stream10.qqmusic.qq.com/244115394.wma”,“ver”:3,“volume”:{“gain”:-6.798999786376953,“lra”:1.991999983787537,“peak”:0.9980000257492065}},{“action”:{“alert”:2,“icons”:8535932,“msg”:14,“switch”:17413891},“album”:{“id”:2272887,“mid”:“001hDUGQ4OTEXL”,“name”:“中国新歌声第二季
第14期”,“pmid”:“001hDUGQ4OTEXL_1”,“subtitle”:"",“title”:“中国新歌声第二季
第14期”,“title_hilight”:“中国新歌声第二季
第14期”},“chinesesinger”:0,“desc”:"",“desc_hilight”:"",“docid”:“13235255486380208149”,“file”:{“b_30s”:0,“e_30s”:0,“media_mid”:“002qfYuH3dUMLF”,“size_128”:3404075,“size_128mp3”:3404075,“size_320”:8509275,“size_320mp3”:8509275,“size_aac”:5150277,“size_ape”:0,“size_dts”:0,“size_flac”:26839612,“size_ogg”:4534034,“size_try”:0,“strMediaMid”:“002qfYuH3dUMLF”,“try_begin”:64750,“try_end”:86220},“fnote”:4009,“genre”:1,“id”:204292892,“index_album”:5,“index_cd”:0,“interval”:212,“isonly”:1,“ksong”:{“id”:3016637,“mid”:“003hNDuZ25l6nB”},“language”:0,“lyric”:"",“lyric_hilight”:"",“mid”:“002b3VP635HgLn”,“mv”:{“id”:0,“vid”:""},“name”:“告白气球”,“newStatus”:2,“nt”:3150272529,“pay”:

但是在这里使用res.text取到的,是字符串。它不是我们想要的列表/字典,数据取不出来。

四.json
在Python语言当中,json是一种特殊的字符串,这种字符串特殊在它的写法——它是用列表/字典的语法写成的。刚刚我们在XHR里查看到的列表/字典,严格来说其实它不是列表/字典,它是json。
下面我们来看它的使用:

import 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')
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为键,查找歌曲名

这样就能提取到所有歌名了。

python学习笔记 Network XHR json相关推荐

  1. python爬虫之b站视频下载(python学习笔记)

    b站视频爬取(python学习笔记) 亲爱的b站自从在2020年3月23日将av号改为BV号后,之前的很多爬虫已经不能用了,暂时没看懂这操作的意义何在,反而一大串大小写英文字母加数字的BV号让人很难记 ...

  2. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  3. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

  4. Python 学习笔记(3)对txt文件的读与写操作(下)

    上一章节我们讨论了如何对txt文本文件进行读写操作,这一张将讨论如何进行二进制文件的写与读.<Python 学习笔记(3)对txt文件的读与写操作(上)>的链接如下https://blog ...

  5. Python学习笔记:Day 10 用户注册和登陆

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记:Day 9 编写API

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:Day1-2 开发环境搭建

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Python学习笔记:web开发1

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:访问数据库

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. Log4cplus1.04的使用
  2. Fastp对fastq质控
  3. 剑指offer:第一个只出现一次的字符
  4. 前端进阶之如何正确判断this的指向?
  5. 5种样式实现div容器中三图摆放实例对比说明
  6. 4步带你从Web前端小白到入门!
  7. java流程控制结构不包括_以下各项中不属于Java语言流程控制结构的是()。
  8. kali Xss 渗透测试工具
  9. 无线密码破解----minidwep-gtk的PIN破解方法
  10. 红米note9pro刷鸿蒙,红米Note9Pro稳定版刷机包(官方系统固件升级包MIUI11)
  11. NRF52832 PWM 占空比调整详解
  12. Python | 封包
  13. UDS——ISO14229
  14. 东北大学计算机硬件题库,东北大学20春学期《计算机硬件技术基础》在线平时作业123答案100...
  15. 禁用计算机usb设备,电脑如何设置禁止使用USB设备以及电脑怎样屏蔽U盘使用功能...
  16. 你说啥什么?注解你还不会?
  17. 宽带响应超时服务器无应答,宽带服务器无应答怎么办
  18. Java的socket连接以及string字符串长度过长解决
  19. sql查询每科成绩的最高分_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
  20. 关键词生成器在线-在线免费关键词生成器

热门文章

  1. 未名湖边的烦恼引起的递归问题探讨
  2. 一个VB VB.NET源码的博客网站,不错
  3. 严谨型性格分析,严谨型人格的职业发展
  4. mysql -- 基本操作
  5. swift Dictionary 字典
  6. java语言在scada系统中的应用_基于J2EE平台的SCADA系统实现
  7. nyoj-荷兰国旗问题
  8. php实现抠图,如何使用php代码实现印章的抠图(代码)
  9. 小米笔记本桌面添加计算机,小米笔记本外接两个显示屏的设置与操作方法
  10. 音视频学习之-YUV裸数据