關(guān)于使用colly爬取b站評(píng)論進(jìn)行輸出的實(shí)現(xiàn)
Colly是Golang世界最知名的Web爬蟲框架了,它的API清晰明了,高度可配置和可擴(kuò)展,支持分布式抓取,還支持多種存儲(chǔ)后端(如內(nèi)存、Redis、MongoDB等)。這篇文章記錄我使用colly在爬取b站評(píng)論時(shí)的整體過(guò)程 :)
!??!這并不是一篇教程,勉強(qiáng)說(shuō)只是一個(gè)使用colly的小例子,只是記錄了我寫代碼的過(guò)程而已,不會(huì)對(duì)具體的代碼或方法進(jìn)行具體說(shuō)明,所以如果您還沒(méi)有學(xué)習(xí)colly,建議您先去學(xué)一下,上手使用一下
思路:
????????獲取b站某個(gè)視頻評(píng)論數(shù)據(jù),需要找到具體的url,數(shù)據(jù)會(huì)以json格式被url返回
????????擁有相對(duì)應(yīng)的結(jié)構(gòu)體,評(píng)論中的數(shù)據(jù)可以放在結(jié)構(gòu)體當(dāng)中
????????獲取請(qǐng)求頭??
????????使用colly的OnResponse()方法進(jìn)行對(duì)得到的json數(shù)據(jù)進(jìn)行處理
????????輸出評(píng)論

首先,網(wǎng)頁(yè)可以分為靜態(tài)網(wǎng)頁(yè)和動(dòng)態(tài)網(wǎng)頁(yè),對(duì)于靜態(tài)網(wǎng)頁(yè),如下圖bing搜索頁(yè)面,可以直接在開發(fā)者工具中的網(wǎng)絡(luò)項(xiàng)里很容易找到該頁(yè)面的url,而該頁(yè)面的所有數(shù)據(jù)都存放在該url當(dāng)中。

因此只需要在元素項(xiàng)當(dāng)中找到想要爬取的內(nèi)容復(fù)制其selector選擇器,這一步也很簡(jiǎn)單,然后在代碼中使用OnHTML()函數(shù)進(jìn)行操作,b站也有相關(guān)的視頻對(duì)此講解,因此不再累述。


而對(duì)于像嗶哩嗶哩這樣的動(dòng)態(tài)網(wǎng)頁(yè),我們無(wú)法使用OnHTML直接爬取整個(gè)頁(yè)面的數(shù)據(jù),因?yàn)樗袛?shù)據(jù)并不會(huì)放在該頁(yè)面地址欄上的url里,比如b站評(píng)論的數(shù)據(jù)會(huì)單獨(dú)放在一個(gè)url里進(jìn)行返回。
所以首先需要在開發(fā)者工具里找到屬于評(píng)論數(shù)據(jù)的url,一般為json格式,在網(wǎng)絡(luò)項(xiàng)中選中Fetch/XHR格式,若名稱條數(shù)依舊很多,可以在篩選器中輸入reply進(jìn)行篩選

在預(yù)覽中我們可以看到返回的評(píng)論數(shù)據(jù)

在標(biāo)頭中可以打開該url進(jìn)行查看

這密密麻麻的數(shù)據(jù)真是閃我一臉,想要更好的查看返回的json數(shù)據(jù)可以在edge瀏覽器安裝
JSON-handle插件


安裝好后再次打開url,啊,清爽多了
發(fā)現(xiàn)該url只記錄了前20個(gè)評(píng)論數(shù)據(jù),可以推出還有其他的url,因?yàn)槭荊ET請(qǐng)求,所以通過(guò)比較不同其它評(píng)論的url,可以通過(guò)更改param獲取不同的20條評(píng)論,這件事若讀者有興趣可以去做一下,在此我不做深究

然后我們就需要把這些json數(shù)據(jù)轉(zhuǎn)化為對(duì)應(yīng)的結(jié)構(gòu)體,這樣url返回的數(shù)據(jù)就可以直接存儲(chǔ)在我們定義的結(jié)構(gòu)體里了,為了簡(jiǎn)便我們可以使用在線工具進(jìn)行轉(zhuǎn)換
這里提供一個(gè)網(wǎng)站?JSON轉(zhuǎn)Golang Struct - 在線工具 - OKTools
https://oktools.net/json2go

可以根據(jù)喜好選擇結(jié)構(gòu)體展開或嵌套的形式,我這邊選擇嵌套,看著更直觀一點(diǎn)
復(fù)制后把代碼放到IDE中,結(jié)構(gòu)體竟然達(dá)到了快500行,并且有錯(cuò)誤

查看后錯(cuò)誤是命名重復(fù)導(dǎo)致的,先無(wú)視
首先注意到生成的結(jié)構(gòu)體的變量名稱是以駝峰名命名的,對(duì)應(yīng)著json數(shù)據(jù)的蛇形命名

對(duì)json數(shù)據(jù)變量名稱一一對(duì)比,確實(shí)只是多了3個(gè)Content結(jié)構(gòu)體,刪除即可,而對(duì)我們不需要的數(shù)據(jù),也可以在結(jié)構(gòu)體中進(jìn)行刪除

最終,我留下了以下結(jié)構(gòu)體數(shù)據(jù),如下圖


現(xiàn)在我們的結(jié)構(gòu)體有了,對(duì)應(yīng)的url也同樣找到了,我們還需要再網(wǎng)頁(yè)上復(fù)制該網(wǎng)頁(yè)的請(qǐng)求標(biāo)頭,

當(dāng)然,我們可以使用在線工具自動(dòng)生成請(qǐng)求標(biāo)頭的相關(guān)代碼,
我分享一個(gè)我使用的:在線curl命令轉(zhuǎn)代碼 (lddgo.net)
https://www.lddgo.net/convert/curl-to-code
怎么使用呢? 如下圖操作,復(fù)制為cURL(bash),不用全部復(fù)制哦

我們這個(gè)的url請(qǐng)求方式是GET,所以選擇GET,把復(fù)制內(nèi)容覆蓋進(jìn)去進(jìn)行轉(zhuǎn)換

輸出結(jié)果是一個(gè)go原生的連接url的代碼,我們只需要復(fù)制所有的req.Header.Set()即可,
*如果同一個(gè)網(wǎng)站被相同瀏覽器頻繁訪問(wèn),很容易被網(wǎng)站識(shí)別為爬蟲程序,所以一般通過(guò)使用多個(gè)User-Agent隨機(jī)調(diào)用的方式,可以有效避免同一個(gè)請(qǐng)求頭訪問(wèn)網(wǎng)站,網(wǎng)上也有很多的方式去隨機(jī)生成user-agent,這邊我找了一個(gè)生成隨機(jī)數(shù)的方法

現(xiàn)在我們的代碼應(yīng)該是這個(gè)樣子

然后我們?cè)谑褂肙n.Response()函數(shù)對(duì)得到的json數(shù)據(jù)進(jìn)行處理

現(xiàn)在我們就可以進(jìn)行遍歷輸出了


嗯...評(píng)論太長(zhǎng)了,我們換一個(gè)視頻并按時(shí)間對(duì)評(píng)論進(jìn)行排序

可以清除看到共20條,大功告成?。?!

附上全部代碼
