前情回顧
先前咱們用過開發者工具
在
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