貓哥教你寫爬蟲 038--帶參數請求

前情回顧

先前咱們用過開發者工具

1559357214667
1559357258164

Network,有很是重要的一類請求是XHR,人們沒必要刷新/跳轉網頁,便可加載新的內容。

隨着技術發展,XHR的應用頻率愈來愈高,咱們經常須要在這裏找咱們想要的數據。

XHR的功能是傳輸數據,其中有很是重要的一種數據是用json格式寫成的,

html同樣,這種數據可以有組織地存儲大量內容。

json的數據類型是「文本」,在Python語言當中,咱們把它稱爲字符串。

咱們可以很是輕易地將json格式的數據轉化爲列表/字典,也能將列表/字典轉爲json格式的數據。

1559357380439
1559357626453

什麼是帶參數請求數據

當你在豆瓣搜索「海邊的卡夫卡」,它的網址會是這樣:

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
複製代碼

1559358747569

咱們能夠把url做爲一個參數, 傳入reqeusts.get()函數

1559359060709
1559359322431

咱們能夠篩掉無用的參數, 或者嘗試一下另外一種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)
複製代碼

1559359461426
1559359425615

使用postman快速獲取參數的鍵和值

1559359539012
1559359570383

帶請求頭(Request Headers)的訪問

什麼是Request Headers

不容許爬蟲訪問的網站, 須要使用請求頭, 假裝爲瀏覽器訪問

1559361323569

如何添加Requests Headers

1559361421819
1559361576841
1559361691894

帶請求頭和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

1559363382216

對比get請求, 只有兩處變化, get==>post, params==>data

1559363448982

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

相關文章
相關標籤/搜索