第8課 帶參數(shù)請求數(shù)據(jù)

一、什么是參數(shù)

1. 每個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

2. 這前半部分是我們所請求的地址,它告訴服務(wù)器,我想訪問這里。而后半部分,就是我們的請求所附帶的參數(shù),它會告訴服務(wù)器,我們想要什么樣的數(shù)據(jù)。

參數(shù)的結(jié)構(gòu),會和字典很像,有鍵有值,鍵值用=連接;每組鍵值之間,使用&來連接。

而我們的請求所附帶的參數(shù)是“海邊的卡夫卡”:q=%E6%B5%B7%E8%BE%B9%E7%9A%84%E5%8D%A1%E5%A4%AB%E5%8D%A1(那段你看不懂的代碼,它是“海邊的卡夫卡”使用utf-8編碼的結(jié)果)。

二、爬取評論信息

1. 首先,進(jìn)入網(wǎng)址:https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html。

2. 打開Network,選中All,點擊刷新。

3.?第0個請求一般都會是html。我們點開第0個請求來看看(看Preview或Response都可以),看里面有沒有我們想要的評論信息。顯然是沒有的。我們現(xiàn)在去看XHR。

4.?先把Network面板清空,再點擊一下精彩評論的點擊加載更多,看看有沒有多出來的新XHR,多出來的那一個,就應(yīng)該是和評論相關(guān)的啦。

5.?我們點開這個請求的Preview,能夠在['comment']['commentlist']里找到評論列表。列表的每一個元素都是字典,字典里鍵rootcommentcontent對應(yīng)的值,就是我們要找的評論。

6.?于是我們就在找到擁有評論數(shù)據(jù)的頁面鏈接(請求的Headers欄:General中的Request URL):

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&notice=0&platform=yqq.json&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=102065756&cmd=6&needmusiccrit=0&pagenum=1&pagesize=15&lasthotcommentid=song_102065756_3202544866_44059185&domain=qq.com&ct=24&cv=10101010

7. 之前我們直接用requests.get()請求了url。如果我們想拿到更多精彩評論。就要讀懂url的各個參數(shù)。修改它們,重新發(fā)起請求。

8.讀懂參數(shù),有兩個重要的方法是“觀察”和“比較”?!坝^察”指的是閱讀參數(shù)的鍵與值,嘗試?yán)斫馑暮x。“比較”指的是比較兩個相近的XHR——它們有哪些不同,對應(yīng)的頁面顯示內(nèi)容有什么不同。

9.我們來觀察比較,依然在“七里香”的歌曲詳情頁,點擊精彩評論的點擊加載更多按鈕,此時Network會多加載出更多的XHR,但是Name為fcg_global_comment_h5…才是我們關(guān)心的XHR。

分別點開它們的Query String Parametres,比較參數(shù)之間有什么不同。

只有一個參數(shù)在變化。這個參數(shù)是pagenum,第一次點擊加載更多的值為1,第二第三次點擊它的值就變成了2和3。

三、代碼實現(xiàn)

1.我們寫一個循環(huán),每次循環(huán)都去更改pagenum的值,就能爬取好多精彩評論。

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&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')# 調(diào)用get方法,下載評論列表

json_comments=res_comments.json()# 使用json()方法,將response對象,轉(zhuǎn)為列表/字典

list_comments=json_comments['comment']['commentlist']# 一層一層地取字典,獲取評論列表

for comment in list_comments:# list_comments是一個列表,comment是它里面的元素

print(comment['rootcommentcontent'])# 輸出評論

print('-----------------------------------')# 將不同的評論分隔開來

2.? 事實上,requests模塊里的requests.get()提供了一個參數(shù)叫params,到網(wǎng)上去搜參數(shù)例表,可以讓我們用字典的形式,把參數(shù)傳進(jìn)去。

import requests# 引用requests模塊

url='https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'# 歌曲評論的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方法,下載這個字典

json_comments=res_comments.json()

list_comments=json_comments['comment']'commentlist']

for comment in list_comments:

print(comment['rootcommentcontent'])

print('-----------------------------------')

3.?看看我們搜索的首頁URL:

https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰倫

這個鏈接的前半部分是https://y.qq.com/portal/search.html,后半部分是page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰倫,然而,分隔這兩部分的符號不是?,而是#。其實在這里,#和?的功能是一樣的,作用都是分隔。

察一下后半部分的參數(shù)page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰倫,page(中文:頁面),searchid(中文:搜索id),remoteplace(中文:遠(yuǎn)程位置)

如果改變搜索頁面(https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰倫)的page這個參數(shù)我們是否可以訪問到其他頁面的數(shù)據(jù)呢?

還記得更快查找XHR的作嗎?1??先把Network面板清空,2??再修改page值按回車鍵,3??查看Network多出來的新XHR,也就是這個client_search_cp..。

4. Request Header? 的用法:

每一個請求,都會有一個Requests Headers,我們把它稱作請求頭。它里面會有一些關(guān)于該請求的基本信息,比如:這個請求是從什么設(shè)備什么瀏覽器上發(fā)出?這個請求是從哪個頁面跳轉(zhuǎn)而來?

Requests模塊允許我們?nèi)バ薷腍eaders的值。點擊它的官方文檔,搜索“user-agent”查看更多信息。

只需要封裝一個字典就好了。和寫params非常相像。

5. 參考代碼:

import requests

url='https://c.y.qq.com/soso/fcgi-bin/client_search_cp'

headers={'origin':'https://y.qq.com',

'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',

user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',}# 偽裝請求頭

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ā)起請求,填入請求頭和參數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容