什么是帶參數(shù)請(qǐng)求數(shù)據(jù)?
URL的組成
完整url都由兩部分組成:“前半部分?后半部分”
前半部分大多形如:https://xx.xx.xxx/xxx/xxx。是我們所請(qǐng)求的地址。它告訴服務(wù)器,我想訪問這里。
后半部分多形如:xx=xx&xx=xxx&xxxxx=xx&……。是我們的請(qǐng)求所附帶的參數(shù)。它會(huì)告訴服務(wù)器,我們想要什么樣的數(shù)據(jù)。參數(shù)的結(jié)構(gòu),會(huì)和字典很像,有鍵有值。鍵值用=連接;每組鍵值之間,使用&來連接。
前半部分和后半部分使用“?”來連接。
舉例:
https://www.douban.com/search?q=%E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1
在Network下查找參數(shù)數(shù)據(jù)
1、 打開Network,選中All,點(diǎn)擊刷新。第0個(gè)請(qǐng)求一般都會(huì)是html。我們點(diǎn)開第0個(gè)請(qǐng)求來看看(看Preview或Response都可以),看里面有沒有我們想要的信息。
2、 沒有。轉(zhuǎn)去看XHR
3、 常規(guī)來說有兩種方法來尋找XHR:閱讀它們的name看看哪個(gè)可能是;或者是一個(gè)一個(gè)翻。還有一種更好的方法是先把Network面板清空,再點(diǎn)擊一下要找欄目的“點(diǎn)擊加載更多”,看看有沒有多出來的新XHR,多出來的那一個(gè),就應(yīng)該是和要找的內(nèi)容相關(guān)的啦。

4、回到上面我們找到XHR的地方,選中Headers,保持General打開,保持Response Headers和Request Headers關(guān)閉。點(diǎn)開Query String Parametres,它的中文翻譯是:查詢字符串參數(shù)。
如何帶參數(shù)請(qǐng)求數(shù)據(jù)
讀懂url的各個(gè)參數(shù),修改它們,重新發(fā)起請(qǐng)求。
讀懂參數(shù),有兩個(gè)重要的方法是“觀察”和“比較”。
“觀察”指的是閱讀參數(shù)的鍵與值,嘗試?yán)斫馑暮x。
“比較”指的是比較兩個(gè)相近的XHR——它們有哪些不同,對(duì)應(yīng)的頁面顯示內(nèi)容有什么不同。分別點(diǎn)開它們的Query String Parametres,比較參數(shù)之間有什么不同。
舉例:
查看一個(gè)熱點(diǎn)文章(或歌曲等)的評(píng)論。很多時(shí)候,因?yàn)樵u(píng)論太多需要跨過很多頁面。通過觀察和比較,我們發(fā)現(xiàn)它們?cè)趨?shù)上的變化只是體現(xiàn)在pagenum一個(gè)值上。
目標(biāo):寫一個(gè)次數(shù)不超過5的循環(huán),每次循環(huán)去更改pagenum的值,爬取5個(gè)頁面上的評(píng)論信息。
寫法如下:
import requests# 引用requests模塊
for i in range(5):
res_comments = requests.get('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¬ice=0&platform=yqq.json&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=102065756&cmd=6&needmusiccrit=0&pagenum='+str(i)+'&pagesize=15&lasthotcommentid=song_102065756_3202544866_44059185&domain=qq.com&ct=24&cv=10101010') # 調(diào)用get方法,下載評(píng)論列表
json_comments = res_comments.json() # 使用json()方法,將response對(duì)象,轉(zhuǎn)為列表/字典
list_comments = json_comments['comment']['commentlist'] # 一層一層地取字典,獲取評(píng)論列表
for comment in list_comments: # list_comments是一個(gè)列表,comment是它里面的元素
print(comment['rootcommentcontent']) # 輸出評(píng)論
print('-----------------------------------') # 將不同的評(píng)論分隔開來
params參數(shù)
用途:
可以讓我們用字典的形式,把參數(shù)傳進(jìn)去。
上述代碼的更優(yōu)雅的表達(dá)方法:
把Query String Parametres里的內(nèi)容,直接復(fù)制下來,封裝為一個(gè)字典,傳遞給params。只是有一點(diǎn)要特別注意:要給他們打引號(hào),讓它們變字符串。
import requests# 引用requests模塊
url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'# 請(qǐng)求歌曲評(píng)論的url參數(shù)的前面部分
for i in range(5):
params = {
'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':str(i),
'pagesize':'15',
'lasthotcommentid':'song_102065756_3202544866_44059185',
'domain':'qq.com',
'ct':'24',
'cv':'10101010'
} # 將參數(shù)封裝為字典
res_comments = requests.get(url,params=params) # 調(diào)用get方法,下載這個(gè)字典
json_comments = res_comments.json()
list_comments = json_comments['comment']['commentlist']
for comment in list_comments:
print(comment['rootcommentcontent'])
print('-----------------------------------')
通過修改URL的參數(shù),獲取被隱藏的部分內(nèi)容
舉例:
import requests# 引用requests模塊
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
for x 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':str(x+1),#關(guān)鍵修改環(huán)節(jié)
'n':'20',
'w':'周杰倫',
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
} # 將參數(shù)封裝為字典
res_music = requests.get(url,params=params) # 調(diào)用get方法,下載這個(gè)字典
json_music = res_music.json() 使用json()方法,將response對(duì)象,轉(zhuǎn)為列表/字典
list_music = json_music['data']['song']['list']# 一層一層地取字典,獲取歌單列表
for music in list_music: # list_music是一個(gè)列表,music是它里面的元素
print(music['name']) # 以name為鍵,查找歌曲名
print('所屬專輯:'+music['album']['name']) # 查找專輯名
print('播放時(shí)長:'+str(music['interval'])+'秒') # 查找播放時(shí)長
print('播放鏈接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n') # 查找播放鏈接
什么是Request Headers

每一個(gè)請(qǐng)求都會(huì)有一個(gè)Requests Headers,叫請(qǐng)求頭。它里面會(huì)有一些關(guān)于該請(qǐng)求的基本信息,比如:這個(gè)請(qǐng)求是從什么設(shè)備什么瀏覽器上發(fā)出?這個(gè)請(qǐng)求是從哪個(gè)頁面跳轉(zhuǎn)而來?
如上圖:
user-agent(中文:用戶代理)會(huì)記錄電腦的信息和瀏覽器版本。
origin(中文:源頭)和referer(中文:引用來源)則記錄了這個(gè)請(qǐng)求,最初的起源是來自哪個(gè)頁面。它們的區(qū)別是referer會(huì)比origin攜帶的信息更多些。
用途:
反爬。如果想告知服務(wù)器,我們不是爬蟲是一個(gè)正常的瀏覽器,就要去修改user-agent。倘若不修改,那么這里的默認(rèn)值就會(huì)是Python,會(huì)被瀏覽器認(rèn)出來。而對(duì)于爬取某些特定信息,也要求你注明請(qǐng)求的來源,即origin或referer的內(nèi)容。如果不注明就有可能拿不到想要的數(shù)據(jù),根據(jù)情況決定。
如何添加Requests Headers
Requests模塊允許修改Headers的值。
添加方法:
只需要封裝一個(gè)字典就好了。和寫params非常相像。
無論是修改user-agent,還是修改origin或referer都一樣,一并作為字典寫入headers就好。
舉例:
import requests
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
headers = {
'origin':'https://y.qq.com', # 請(qǐng)求來源
'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html', # 請(qǐng)求來源,攜帶的信息比“origin”更豐富
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/XXX.XX (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/XXX.XX', # 標(biāo)記了請(qǐng)求從什么設(shè)備,什么瀏覽器上發(fā)出
}# 偽裝請(qǐng)求頭
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':1,
'n':'20',
'w':'周杰倫',
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}# 將參數(shù)封裝為字典
res_music = requests.get(url,headers=headers,params=params)# 發(fā)起請(qǐng)求,填入請(qǐng)求頭和參數(shù)