溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

發(fā)布時(shí)間:2021-11-09 18:23:47 來源:億速云 閱讀:287 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

說起Node.js,可能最突出的特點(diǎn)就是它的異步特性。

這里教大家用Node.js完成一個(gè)簡單的爬蟲:爬取CNode社區(qū)首頁的所有帖子標(biāo)題和鏈接。

Node.js需要使用到三個(gè)包:express,superagent,cheerio。

express:Node.js應(yīng)用最廣泛的web框架

superagent:http相關(guān)的庫,可以發(fā)起getpost請求。

cheerio:可以用來從網(wǎng)頁中以css選擇器方式取得數(shù)據(jù)。其實(shí)可以理解為是Node.js版本的JQuery.

首先,新建一個(gè)空文件夾creeper。打開vs code終端。(vs code基本安裝及配置文章鏈接)。在vs code終端進(jìn)入creeper文件夾。

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

可以看到,我已經(jīng)成功創(chuàng)建了creeper文件夾并成功進(jìn)入。首先在終端使用npm init命令初始化項(xiàng)目

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

然后使用npm install命令安裝express,superagent,cheerio三個(gè)依賴。

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

首先,在app.js文件頂部導(dǎo)入我們剛才所依賴的三個(gè)包

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

到這里項(xiàng)目基本配置完成了,下一步就是寫簡單爬蟲的邏輯代碼了

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

其實(shí)實(shí)現(xiàn)簡單爬蟲代碼就只需要簡單的30行代碼。在頂部導(dǎo)入我們依賴的包,底部監(jiān)聽爬蟲程序運(yùn)行于5000端口。中間實(shí)現(xiàn)爬蟲的邏輯處理。通過app.get定義一個(gè)get請求的接口,接口名稱/,表示訪問根路徑,也就是我們測試只需要使用get請求訪問http://127.0.0.1:5000就可以訪問到我們寫的簡單爬蟲,使用superagentCNode社區(qū)首頁發(fā)起一個(gè)get請求,請求成功返回的result中的text存儲著CNode網(wǎng)頁的內(nèi)容。然后使用cheerio.load去讀取網(wǎng)頁內(nèi)容,然后通過forEach循環(huán)逐條去除帖子標(biāo)題和鏈接。然后給客戶端返回所有取到的帖子標(biāo)題和鏈接。這個(gè)小爬蟲就完成了。我們可以測試下接口能不能正常運(yùn)行。

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

可以清楚看到,我們成功爬取到CNode社區(qū)首頁的所有帖子標(biāo)題以及鏈接。并且以json格式返回給客戶端。

到這里結(jié)束了么?當(dāng)然沒有!別忘了我們這篇文章最重要的是要學(xué)習(xí)Node.js的異步特性,我們剛才使用superagentcheerio來爬取首頁帖子標(biāo)題與鏈接,只需要通過superagent發(fā)起一次get請求就可以做到了。如果我們想同時(shí)取出每個(gè)帖子的第一條評論,這時(shí)我們就得對上一步取到的每個(gè)帖子的鏈接發(fā)起請求,然后依舊使用cheerio去取出第一條評論。Cnode社區(qū)首頁有四十個(gè)帖子,按照邏輯就需要先發(fā)起一次請求取到所有的帖子標(biāo)題和鏈接,然后對每一個(gè)鏈接在此發(fā)起請求,去獲得對應(yīng)的第一條評論。所以我們需要發(fā)起41次請求,這就涉及到Node.js的異步特性了。對Node.js比較熟悉的可能會(huì)知道使用promise或者generator來解決回調(diào)。不過我工作中還是偏向于喜歡直接callback。使用callback進(jìn)行異步請求,一般有eventproxy或者async兩種選擇。

eventproxy與async的區(qū)別

其實(shí)eventproxyasync都是用來做異步流程控制的。如果你爬取的請求小于10次的時(shí)候,你可以選擇用eventproxy,如果你爬取的請求成百上千的話,那就需要考慮使用async,因?yàn)槟阋淮涡园l(fā)起成百上千次請求,原網(wǎng)站可能會(huì)認(rèn)為你是在惡意請求,直接把你訪問ip封掉。這時(shí)候就可以使用async控制并發(fā)請求數(shù)量,一次五到十條,慢慢爬取完所有數(shù)據(jù)。

在這里我選擇eventproxy進(jìn)行異步爬取數(shù)據(jù)。使用eventproxy需要依賴eventproxy包,所以,首先npm install導(dǎo)入eventproxy依賴。

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

先把調(diào)整好的代碼邏輯貼出來:

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

我們來理下新的邏輯的思路:

首先,在頂部導(dǎo)入我們所需要依賴的包。

superagent.get其實(shí)就是之前的操作獲得首頁所有帖子的鏈接,但是剛才我們截圖可以看到,我們爬取到的鏈接都是topic/5bd4772a14e994202cd5bdb7類似這種格式,這很明顯不是可訪問的鏈接,所以前面要拼接CNode的主鏈接形成帖子真正可訪問的鏈接

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

接著,得到一個(gè)eventproxy實(shí)例

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

然后我們要發(fā)起40次請求就需要用到eventproxyafter方法,after方法適合重復(fù)的操作,比如讀取10個(gè)文件,調(diào)用5次數(shù)據(jù)庫等。將handler注冊到N次相同事件的觸發(fā)上。達(dá)到指定的觸發(fā)數(shù),handler將會(huì)被調(diào)用執(zhí)行,每次觸發(fā)的數(shù)據(jù),將會(huì)按觸發(fā)順序,存為數(shù)組作為參數(shù)傳入。

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

最下方使用一個(gè)forEach循環(huán),在循環(huán)里通過superagent發(fā)起get請求輪流請求帖子鏈接取得帖子實(shí)際內(nèi)容。然后通過eventproxyemit方法告訴ep實(shí)例我本次請求結(jié)束了。當(dāng)40次請求全部結(jié)束后eq.after就會(huì)執(zhí)行回調(diào)把取到的數(shù)據(jù)返回客戶端。到這里40次并發(fā)請求爬取數(shù)據(jù)成功執(zhí)行。接下來我們來看看運(yùn)行效果吧

怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲

可以看到成功取到CNode社區(qū)首頁帖子標(biāo)題鏈接,并且通過并發(fā)請求取得每一條帖子的第一條評論。當(dāng)然,這種爬取方式對于超過十次請求的一定要慎用,因?yàn)橐恍┐缶W(wǎng)站會(huì)認(rèn)為你是惡意請求直接封禁你ip,這樣就得不償失了。這樣情況下就可以考慮使用async控制并發(fā)數(shù)慢慢進(jìn)行爬取數(shù)據(jù)。

以上就是怎么使用superagent、eventproxy與cheerio實(shí)現(xiàn)簡單爬蟲,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI