前情回顾
先前咱们用过开发者工具
在
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¬ice=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--完结撒花.mdhtml