hutool请求get带参数请求_爬虫(四)——带参数请求

一、什么是带参数请求

   豆瓣搜索“海边的卡夫卡”网址:https://www.douban.com/search?q=%E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1,

  知乎搜索“宇宙大爆炸”网址:https://www.zhihu.com/search?type=content&q=%E5%AE%87%E5%AE%99%E5%A4%A7%E7%88%86%E7%82%B8。

   可以看到每个url都由两部分组成:前半部分形如:https://xx.xx.xxx/xxx/xxx,后半部分形如:xx=xx&xx=xxx&xxxxx=xx&……两部分使用?来连接。其中前半部分是基网址,告诉服务器想访问的地址,后半部分就是请求所附带的参数,它会告诉服务器,需要什么样的数据。参数的结构和字典很像,有键有值,键值用=连接;每组键值之间,使用&来连接。

二、查看数据的参数

   打开周杰伦QQ音乐搜索链接: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,发现qq音乐不支持更多歌曲的翻阅功能,没有对应的网页源代码。

   更多评论

   精彩评论可以通过点击“加载更多”获得更多数据,最新评论则需要翻页来进行数据更新。

   以爬取《七里香》用户的精彩评论为例:https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html。打开Network,选中All,点击刷新。首先看看数据是否在第0个请求里面,显然是没有的。再看看XHR:

   常规来说有两种方法来寻找XHR:阅读它们的name看看哪个可能是评论;或者是一个一个翻。对于有“加载更多”、“下一页”等点击项的页面来说,还有一个简单的技巧:先把Network面板清空,再点击一下精彩评论的点击加载更多,多出来的请求就是和评论相关的请求。

   点开这个请求的Preview,能够在['comment']['commentlist']里找到评论列表。列表的每一个元素都是字典,字典里键rootcommentcontent对应的值,就是我们要找的评论。

   在该请求的Headers栏:General中的Request URL中可以找到拥有评论数据的真实网址:https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?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=6&needmusiccrit=0&pagenum=1&pagesize=15&lasthotcommentid=song_102065756_3202544866_44059185&domain=qq.com&ct=24&cv=10101010。这种长链接阅读体验非常差,其实在Query String Parameters(查询字符串参数)中有依次展开的参数键值对。

   点击精彩评论的“加载更多”,此时Network会多加载出更多的XHR,分别点开它们的Query String Parameters,会发现众多参数中只有pagenum(页面)的值发生了变化,第一次点击加载更多的值为1,第二第三次点击它的值就变成了2和3。因此可以写一个循环,每次循环都去更改pagenum的值,这样就能爬取更多的评论。

   更多歌曲

   如果想要爬取周杰伦更多的歌曲信息,QQ音乐要求下载一个客户端。

   看一下搜索首页的网址:https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰伦。这个链接的前半部分是https://y.qq.com/portal/search.html,后半部分是page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰伦(#和?都可以起到分隔连接作用)。其中page(中文:页面),searchid(中文:搜索id),remoteplace(中文:远程位置)。查看更多评论是通过改变pagenum值实现的,这里访问其他页面数据也是通过改变page值实现的。

   先把Network面板清空,再修改page值按回车键,查看Network多出来的新XHR。

   找到对应的请求,点开Headers,查看Query String Parameters,观察参数的变化规律。

   p值和searchid都在变化,但通过前面的网页测试来看,searchid的值都为1仍然成功翻页,因此只需对p值循环即可。 

三、传递参数

   requests模块里的requests.get()提供了一个参数叫params,可以用字典的形式,把参数传进去。官方文档描述是:

   所以可以把QueryString Parameters里的内容,直接复制下来,封装为一个字典,传递给params。只是有一点要特别注意:要给他们打引号,让它们变字符串。

四、Request Headers伪装

   每一个请求,都会有一个Request Headers(请求头)。它里面会有一些关于该请求的基本信息,比如:这个请求是从什么设备什么浏览器上发出,这个请求是从哪个页面跳转而来。

   上图中user-agent(中文:用户代理)会记录电脑的信息和浏览器版本,origin(源头)和referer(引用来源)则记录了这个请求最初的起源是来自哪个页面。如果想将爬虫程序伪装成一个正常的浏览器。需要修改user-agent否则默认值就会是Python,服务器能识别是爬虫。Requests模块允许修改Headers的值,查看官方文档会发现只需要封装一个字典就行了,origin或referer也类似。

五、实操——QQ音乐周杰伦更多歌曲+更多评论

import requestsurl = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'# 伪装请求头headers = {    'origin':'https://y.qq.com',    'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',    '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',    }# 将参数封装为字典for i 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':i,    '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,headers=headers,params=params)#解析json数据    json_music = res_music.json()# 一层一层地取字典,获取歌单列表      list_music = json_music['data']['song']['list']    for music in list_music:        # 以name为键,查找歌曲名        print(music['name'])        # 查找专辑名        print('所属专辑:'+music['album']['name'])        # 查找播放时长        print('播放时长:'+str(music['interval'])+'秒')        # 查找播放链接        print('播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n')


版权声明:本文为weixin_40008870原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>