1.单页内容爬取,直接用requests.get()请求了url。如果我们想拿到更多歌曲清单。就要读懂它的各个参数。修改它们,重新发起请求。
2.读懂参数,有两个重要的方法是“观察”和“比较”。“观察”指的是阅读参数的键与值,尝试理解它的含义。“比较”指的是比较两个相近的XHR——它们有哪些不同,对应的页面显示内容有什么不同。
3.不同页码的歌曲列表,它们url的不同。依然在搜索“周杰伦”的结果页,点击第2页、第3页进行翻页,此时Network会多加载出2个XHR,它们的Name都是client_search…。
4.分别点开它们的Query String Parametres,比较参数之间有什么不同。
5.在此,只有一个参数变化。这个参数是p。第1页p的值为1,第二、第三页的值则为2和3。说明p代表的应该就是页码。
6.如果你再去对比它们的url,也能发现同样的事实:url整个儿都是一样的,只有p的值发生变化。
7.按照之前的知识,写一个循环,每次循环去更改p的值,这样就能实现爬取好多
参考代码示意
import requests
#引用requests模块
for x in range(5): #循环5次
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='+str(x+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')
# 查找播放链接
requests模块应用代码精简
requests.get()提供了一个参数叫params,可以让我们用字典的形式,把参数传进去。
URL传递参数的形式为:httpbin.org/get?key=val。但是手动的构造很麻烦,这是可以使用params参数来方便的构造带参数URL。
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)
http://httpbin.org/get?key1=value1&key2=value2
同一个key可以有多个value
import requests
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3
精简后参考代码
import requests
#引用requests模块
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
for x in range(5): #循环次数
params = {
'ct':'24',
'qqmusic_ver': '1298',
'new_json':'1',
'remoteplace':'sizer.yqq.song_next',
'searchid':'64405487069162918',
't':'0',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'flag_qc':'0',
'p':str(x+1),
'n':'20',
'w':'林心如', #修改名称即可下载其他歌手音乐
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}
# 将参数封装为字典
res_music = requests.get(url,params=params)
# 调用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')
# 查找播放链接
import requests
#引用requests模块
url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'
commentid = ''
#设置一个初始commentid
for x in range(5):
params = {
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'GB2312',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0',
'cid':'205360772',
'reqtype':'2',
'biztype':'1',
'topid':'102065756',
'cmd':'8',
'needcommentcrit':'0',
'pagenum':str(x),
'pagesize':'25',
'lasthotcommentid':commentid,
'domain':'qq.com',
'ct':'24',
'cv':'101010 '
}
# 将参数封装为字典,其中pagenum和lastcommentid是特殊的变量
res_comment = requests.get(url,params=params)
# 调用get方法,下载评论列表
json_comment = res_comment.json()
# 使用json()方法,将response对象,转为列表/字典
list_comment = json_comment['comment']['commentlist']
# 一层一层地取字典,获取评论列表
for comment in list_comment:
# list_comment是一个列表,comment是它里面的元素
print(comment['rootcommentcontent'])
# 输出评论
commentid = list_comment[24]['commentid']
# 将最后一个评论的id赋值给comment,准备开始下一次循环
user-agent会记录电脑的信息和浏览器版本。
origin和referer则记录了这个请求,最初的起源是来自哪个页面,它们的区别是referer会比origin携带的信息更多些。
如我们告知服务器,我们不是爬虫是一个正常的浏览器,就要去修改user-agent。
像百度的爬虫,它的user-agent是Baiduspider,谷歌的也会是Googlebot……如是种种。
代码示例
headers = {
'origin':'https://y.qq.com',
# 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',
# 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
# 标记了请求从什么设备,什么浏览器上发出
}