Python—爬⾍之Network,XHR,json带参数请求数据爬取歌单、歌词)Python—爬⾍之Network,XHR,json & 带参数请求数据(爬取歌单、歌词)
Network是什么,能做什么
⽹页中F12打开⽹页源代码,就可以看到Network。
Network的功能是:记录在当前页⾯上发⽣的所有请求。
为什么我们需要从Network中获取信息,因为只有⽐较⽼(或⽐较轻量)的⽹站,我们⽤requests和BeautifulSoup就能解决它们,⽽对于⽐较复杂的⽹站,关键信息都是在实时⽹页的请求中,我们需要到被隐藏的数据请求,才能继续进⾏下⼀步。
XHR 要如何请求
完整表述是:XHR and Fetch
不知道⼤家有没有仔细观察过,浏览器上⽅,它所访问的⽹址没变,但是⽹页⾥却新加了内容
典型代表:如购物⽹站,下滑⾃动加载出更多商品。在线翻译⽹站,输⼊中⽂实时变英⽂
这个,叫做Ajax技术,应⽤这种技术,更新⽹页内容,不⽤重新加载整个⽹页,⼜省流量⼜省时间
json格式的转换
json则是另⼀种组织数据的格式,和html⼀样,常⽤来做⽹络数据传输。
json和XHR之间的关系:XHR⽤于传输数据,它能传输很多种数据,json是被传输的⼀种数据格式。
import json            # 引⼊json模块
a =[1,2,3,4]          # 创建⼀个列表a。
b = json.dumps(a)      # 使⽤dumps()函数,将列表a转换为json格式的字符串,赋值给b。
print(type(b))          # 打印b的数据类型,结果为字符串
c = json.loads(b)      # 使⽤loads()函数,将json格式的字符串b转为列表,赋值给c。
print(type(c))          # 打印c的数据类型,⼜转回列表了
⼩⾯展⽰⼀个实际案例应⽤,爬取⼀下你喜欢的“动次打次”的列表,并⽤json来解析数据。
import requests                # 引⽤requests库
for i in range(60):
res_music = ('c.y.qq/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchi d=61322692688223569&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p={}&n=10&w=%E6%9D%8E%E5%AE%87%E6%98%A5&g_tk=5381&login Uin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0'.format(i))
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('播放链接:y.qq/n/yqq/song/'+music['mid']+'.html\n')            # 查播放链接
带参数请求数据
把Query String Parametres⾥的内容,直接复制下来,封装为⼀个字典,传递给params。
只是有⼀点要特别注意:要给他们打引号,让它们变字符串。
import requests                # 引⽤requests库
url ='c.y.qq/soso/fcgi-bin/client_search_cp'      #提取问号前半部分即可
for i in range(10):
params ={
'ct':'24',
'qqmusic_ver':'1298',
'new_json':'1',
'remoteplace':'txt.yqq.song',
'searchid':'68182391123460136',
't':'0',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'flag_qc':'0',
'p':str(i+1),            #此处是翻页,所以要加1
'n':'10',
'w':'李宇春',
'g_tk':'240259037',
'loginUin':'757072505',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}
res_music = (url,params = params)
json_music = res_music.json()                      # 使⽤json()⽅法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
for music in list_music:
print(music['name'])
print('所属专辑:'+music['album']['name'])
qqyprint('播放时长:'+str(music['interval'])+'秒')
print('播放链接:y.qq/n/yqq/song/'+music['mid']+'.html\n')
修改请求头,便于让爬⾍伪装成浏览器去获得我们需要的信息。
import requests
url ='c.y.qq/soso/fcgi-bin/client_search_cp'
headers ={
'origin':'y.qq',          # 请求来源
'referer':'y.qq/portal/search.html',          # 请求来源,携带的信息⽐“origin”更丰富,
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',          # 标记了请求从什么设备,什么浏览器上发出
}
params ={
'ct':'24','qqmusic_ver':'1298','remoteplace':'txt.yqq.lyric','searchid':'94916638404493018',
'aggr':'0','catZhida':'1','lossless':'0','sem':'1','t':'7','p':'1','n':'5','w':'李宇春',
'g_tk':'240259037','loginUin':'757072505','hostUin':'0','format':'json','inCharset':'utf8',
'outCharset':'utf-8','notice':'0','platform':'yqq.json','needNewCode':'0'
}
# 将参数封装为字典,其中pagenum和lastcommentid是特殊的变量
res_comment = (url,headers = headers,params=params)            # 调⽤get⽅法,下载评论列表
json_comment = res_comment.json()                  # 使⽤json()⽅法,将response对象,转为列表/字典
list_comment = json_comment['data']['lyric']['list']
# print(list_comment)
for gc in list_comment:
print(gc['content']+'\n')