今天爬了第二个动态网页,晚上赶紧来回顾一下。
一共4页。100首歌曲。
同样的方法还是在network中抓包,
获取真正的url,然后通过分析得出url的翻页规律。
此处的url:https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?tpl=3&page=detail&date=2019-03-01&topid=4&type=top&song_begin={}
括号内从0开始,步幅是30.也就是说每次翻页,begin后面的数字+30。
在response中我们可以看到页面的响应。通过解析json数据,我们可以看到,这里面有歌手姓名,歌曲名字,歌曲的时长是interval对应的值,这里面用的单位是秒。我们提取后转换一下就可以了。
另外一点就是这个数据包有点坑,开始我爬的时候总是感觉爬下来的数据很多,最后我发现,我们爬的第一个url就加载了所有页面的信息,而第三个url又包含了第四页的页面信息。
OK,开代码:
#动态
#0加载了4页信息,60加载了3、4页的信息
import csv
import requests
import json
fp = open("F:/QQ音乐_0.csv",'wt',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(['歌曲','歌手','时间'])
#因为第一个页面就加载了所有的信息,就不需要翻页了,要不然会重复
urls = ["https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?tpl=3&page=detail&date=2019-03-01&topid=4&type=top&song_begin={}".format(i) for i in range(0,1)]
for url in urls:
print(url)
r = requests.get(url)
results = json.loads(str(r.text))
fins = results.get("songlist")
for fin in fins:
names = fin.get("data").get("singer")
#向获取到这里,这是一个列表,不能再用get,需要转换一下格式
author = names[0].get("name")#歌手
songnames = fin.get("data").get("songname")#歌手
times = fin.get("data").get("interval")#时间
#网页数据中给的时间是以s为单位我们要转换为分
time = str(int(times)//60) + ':'+str(int(times)%60)
writer.writerow([songnames,author,time])
fp.close()
最后结果会是这样:
我们需要用记事本方式打开,并且另存为,将
编码方式设为UTF-8
再打开就可以了: