猫哥教你写爬虫 038--带参数请求

前情回顾

先前我们用过开发者工具

Network,有非常重要的一类请求是XHR,人们不必刷新/跳转网页,即可加载新的内容。

随着技术发展,XHR的应用频率越来越高,我们常常需要在这里找我们想要的数据。

XHR的功能是传输数据,其中有非常重要的一种数据是用json格式写成的,

html一样,这种数据能够有组织地存储大量内容。

json的数据类型是“文本”,在Python语言当中,我们把它称为字符串。

我们能够非常轻易地将json格式的数据转化为列表/字典,也能将列表/字典转为json格式的数据。

什么是带参数请求数据

当你在豆瓣搜索“海边的卡夫卡”,它的网址会是这样:

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
复制代码

当你在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
复制代码

在上面,我们能看到每个url都由两部分组成。前半部分大多形如: https://xx.xx.xxx/xxx/xxx

后半部分,多形如:xx=xx&xx=xxx&xxxxx=xx&……

两部分使用?来连接。举例刚刚的豆瓣网址,

前半部分就是:https://www.douban.com/search

后半部分则是:q=%E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1

它们的中间使用了?来隔开。

这前半部分是我们所请求的地址,它告诉服务器,我想访问这里。

而后半部分,就是我们的请求所附带的参数,它会告诉服务器,我们想要什么。

这参数的结构,会和字典很像,有键有值,键值用=连接;每组键值之间,使用&来连接。

显然,这样一个长链接,阅读体验非常之差。

使用postman, 可以提取其中的参数

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=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&notice=0&platform=yqq.json&needNewCode=0
复制代码

我们可以把url作为一个参数, 传入reqeusts.get()函数

我们可以筛掉无用的参数, 或者尝试一下另一种get()的传参方式...

import requests
# 引用requests模块
param_dict = {
    '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': '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',
    'notice': '0',
    'platform': 'yqq.json',
    'needNewCode': '0'
}
res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp',params=param_dict)
# 调用get方法,下载这个字典
json_music = res_music.json()
# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
print(list_music)
复制代码

使用postman快速获取参数的键和值

带请求头(Request Headers)的访问

什么是Request Headers

不允许爬虫访问的网站, 需要使用请求头, 伪装为浏览器访问

如何添加Requests Headers

带请求头和get参数访问页面的完整代码

import requests
# 引用requests模块
param_dict = {
    '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': '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',
    'notice': '0',
    'platform': 'yqq.json',
    'needNewCode': '0'
}
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
res_music = requests.get(
    'https://c.y.qq.com/soso/fcgi-bin/client_search_cp', params=param_dict, headers=headers
)
# 调用get方法,下载这个字典
json_music = res_music.json()
# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
print(list_music)
复制代码

使用post访问url

对比get请求, 只有两处变化, get==>post, params==>data

import requests
url = "https://music.163.com/weapi/feedback/weblog?csrf_token=db5650eb24595f48831e37a5f2714d90"
data = {
    'params': 'R8vqwjJVSoKGxpUZ3aNZ+0xY0/6bTAkTdj9YgyjFTLBky+VjTNmQWKGFmW9QzsDGraqUAMvLpz6vwJCNZR94O5AXOjelvA7MrzUyP+PrpPUFWZfwcHHSuSuuharZEOLz4jgfYsr+ztgPcN5MY5AERr681xCFPTm3m1o8kuILi/jpb14NvlmQUTJNjD/xBqasMkXadIEzMvd2qhlydO2XmnXFnH7OMGDst31pHUTWLLZu97ZSaOLGJ8IthbzEhqJeZ7SjQdPtt9FF8KAfCpND6sPGCCiveNMwW8m9loGxMtHnsjwMptfvpv0VfWJ3RjP+lR17njfdk40mW0rhc/oA2YBmGpImv3wkMxkT9hx2HnyejQqJC2BTRS47YvHjd7pv',
    'encSecKey': 'c74e502bab858e790474770ae08bf5893565b282db443daf92c11fd20199e033d9d632d37a2899e9c3a59ba4c5987a67d0e36df69235a030caefc3a8258eab948f9ea2498d5637665ebfb347913f5182041db16fe4213cd00bba5d3a81170483990bfae6c660dc7b3e5471abdf58f4c99f4294b14e87658a82fe26552d161843'
}
r = requests.post(url, data=data)
print(r.text)
复制代码

快速跳转:

猫哥教你写爬虫 000--开篇.md
猫哥教你写爬虫 001--print()函数和变量.md
猫哥教你写爬虫 002--作业-打印皮卡丘.md
猫哥教你写爬虫 003--数据类型转换.md
猫哥教你写爬虫 004--数据类型转换-小练习.md
猫哥教你写爬虫 005--数据类型转换-小作业.md
猫哥教你写爬虫 006--条件判断和条件嵌套.md
猫哥教你写爬虫 007--条件判断和条件嵌套-小作业.md
猫哥教你写爬虫 008--input()函数.md
猫哥教你写爬虫 009--input()函数-人工智能小爱同学.md
猫哥教你写爬虫 010--列表,字典,循环.md
猫哥教你写爬虫 011--列表,字典,循环-小作业.md
猫哥教你写爬虫 012--布尔值和四种语句.md
猫哥教你写爬虫 013--布尔值和四种语句-小作业.md
猫哥教你写爬虫 014--pk小游戏.md
猫哥教你写爬虫 015--pk小游戏(全新改版).md
猫哥教你写爬虫 016--函数.md
猫哥教你写爬虫 017--函数-小作业.md
猫哥教你写爬虫 018--debug.md
猫哥教你写爬虫 019--debug-作业.md
猫哥教你写爬虫 020--类与对象(上).md
猫哥教你写爬虫 021--类与对象(上)-作业.md
猫哥教你写爬虫 022--类与对象(下).md
猫哥教你写爬虫 023--类与对象(下)-作业.md
猫哥教你写爬虫 024--编码&&解码.md
猫哥教你写爬虫 025--编码&&解码-小作业.md
猫哥教你写爬虫 026--模块.md
猫哥教你写爬虫 027--模块介绍.md
猫哥教你写爬虫 028--模块介绍-小作业-广告牌.md
猫哥教你写爬虫 029--爬虫初探-requests.md
猫哥教你写爬虫 030--爬虫初探-requests-作业.md
猫哥教你写爬虫 031--爬虫基础-html.md
猫哥教你写爬虫 032--爬虫初体验-BeautifulSoup.md
猫哥教你写爬虫 033--爬虫初体验-BeautifulSoup-作业.md
猫哥教你写爬虫 034--爬虫-BeautifulSoup实践.md
猫哥教你写爬虫 035--爬虫-BeautifulSoup实践-作业-电影top250.md
猫哥教你写爬虫 036--爬虫-BeautifulSoup实践-作业-电影top250-作业解析.md
猫哥教你写爬虫 037--爬虫-宝宝要听歌.md
猫哥教你写爬虫 038--带参数请求.md
猫哥教你写爬虫 039--存储数据.md
猫哥教你写爬虫 040--存储数据-作业.md
猫哥教你写爬虫 041--模拟登录-cookie.md
猫哥教你写爬虫 042--session的用法.md
猫哥教你写爬虫 043--模拟浏览器.md
猫哥教你写爬虫 044--模拟浏览器-作业.md
猫哥教你写爬虫 045--协程.md
猫哥教你写爬虫 046--协程-实践-吃什么不会胖.md
猫哥教你写爬虫 047--scrapy框架.md
猫哥教你写爬虫 048--爬虫和反爬虫.md
猫哥教你写爬虫 049--完结撒花.md

转载于:https://juejin.im/post/5cfc4adc6fb9a07ef06f86ab

猜你喜欢

转载自blog.csdn.net/weixin_33713503/article/details/91416927
今日推荐