python笔记 爬虫精进·第5课 【歌曲目录爬虫,带参数翻页,“Requests Headers”应用,翻页爬取评论,浏览器伪装访问Request Headers】

翻页爬取歌曲名称、链接

翻页:带参数请求数据

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,准备开始下一次循环

伪装浏览器访问

Requests Headers

user-agent会记录电脑的信息和浏览器版本。
origin和referer则记录了这个请求,最初的起源是来自哪个页面,它们的区别是referer会比origin携带的信息更多些。
如我们告知服务器,我们不是爬虫是一个正常的浏览器,就要去修改user-agent。
像百度的爬虫,它的user-agent是Baiduspider,谷歌的也会是Googlebot……如是种种。

添加Requests Headers

代码示例

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',
    # 标记了请求从什么设备,什么浏览器上发出
    }

你可能感兴趣的:(python学习笔记)