歌单网址:
https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰伦
错误爬取示例
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'])
# 打印出我们想要的音乐名
以上爬虫无内容出现,“list_music”为空列表,源代码中无内容展示。
使用检查工具,然后点击【Network】
search.html 内无歌曲清单
请求分类内容:
ALL(查看全部)
XHR(仅查看XHR)
Doc(Document,第0个请求一般在这里)
Img(仅查看图片)
Media(仅查看媒体文件)
Other(其他)
JS和CSS(前端代码负责发起请求和页面实现)
Font是文字的字体
这个网页里一共有10个XHR或Fetch,我们要从里面找出带有歌单的那一个。
笨办法当然是一个一个实验,但聪明的办法是去尝试阅读它们的名字。如你一眼就看到:client_search(客户端搜素)……而且它最大,有10.9KB,我们来点击它。
从左往右分别是:Headers:标头(请求信息)、Preview:预览、Response:原始信息、Timing:时间。
【确认歌名顺序】
“data-song-list-0-name”
代码输出示意
import requests
#引用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¬ice=0&platform=yqq.json&needNewCode=0')
#调用get方法,下载这个字典
print(res.text)
#把它打印出来
使用res.text取到的是字符串,不是列表/字典
在Python语言当中,json是一种特殊的字符串,这种字符串特殊在它的写法——它是用列表/字典的语法写成的。
a = '1,2,3,4'
#这是字符串
b = [1,2,3,4]
#这是列表
c = '[1,2,3,4]'
#这是字符串,但它是用json格式写的字符串
数据需要被有规律地组织起来,我们才能去查找、阅读、分析、理解。比如:汉语字典应该按照拼音排序,文件应该按照一定规律放进不同的文件夹,小说要有章节目录——大标题、中标题、小标题。
组织数据的三条规律
0.要有分层结构(如文件夹,如列表/字典的嵌套)
1.同一层数据,要有排序(如汉语字典按拼音排列,如列表)
2.同一层数据,要有对应关系(如标题对应正文,如字典)
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对象,转为列表/字典
print(type(json_music))
#打印json_music的数据类型
使用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为键,查找歌曲名
提取歌单代码
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为键,查找歌曲名
print('所属专辑:'+music['album']['name'])
# 查找专辑名
print('播放时长:'+str(music['interval'])+'秒')
# 查找播放时长
print('播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n')
# 查找播放链接