一、什么是參數(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):
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¬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方法,下載評論列表
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ù)