用nodejs寫爬蟲同步百度FEX Weekly中的文章

1、 背景

最近團隊leader有給小夥伴以郵件的形式推薦百度FEX團隊站點中Weekly中的文章,文章內容確實很贊!主要推薦了一些業內的活動和一些很讚的文章。很是值得一讀。可是想一想每週都人爲的去copy一份文章而後以郵件的形式發送給小夥伴這種形式有點原始。因此產生了此寫一個爬蟲直接抓取weekly中的更新自動同步過來,目前是同步到我blog中。以後考慮添加一個發送郵件的功能把內容以郵件的形式發送給你們。這樣就實現了自動化了。ok,背景交代完了。node

2、思考

先整個程序的目錄結構圖:git

dMZ*q9AQCwAA
由於後續可能會考慮把360奇舞團的週報內容也同步過來,並且抓取不一樣站點的文章的邏輯也不一樣,爲了把這個程序寫的更具備擴展性一點, 因此必須把抓取的邏輯獨立出來,這個就是pages目錄的由來。裏面分別寫各個站點的抓取邏輯,如: 如今已經實現的fex-weekly.js用於抓取FEX團隊的文章(75team-weekly.js後續會補上)。github

涉及到抓取邏輯,那麼考慮到每一個站點更新的頻率不一樣,如FEX-weekly中的文章通常是週五,週六更新。因此咱們就得有個定時的任務表,裏面設定了全部的抓取任務執行的時間,好比目前我設定的是每週六啓動fex-weekly.js發送一次請求抓取一次。由於這個任務表的存在,因此有了conf文件夾。併發

在考慮到抓取過的文章咱們不該該再去抓取,因此建立了一個db文件用於存儲已經抓取過的文章(固然不是直接存儲文章內容,目前只存了url),用來識別是否已經抓取過了,若是在old文件夾中就說明已經抓取過了,那麼此次就跳過這個文章,抓取最新的文章。dom

到這裏抓取頁面邏輯部分就搞定了,那麼這個抓取任務必需要有人來啓動它而且把抓取後來的文章保存下來,因此必要還要一個main程序,那就是pageSpider.js的由來了。pageSpider主要是常駐內存按咱們設定的時間,啓動抓取任務,獲取抓取內容並保存。 其餘的utils和nodes_modules就很少介紹了,主要是一些工具。async

3、實現

實現部分主要講講pageSpider.jsfex-weekly.jside

pageSpider獲取conf中的任務列表,而且遍歷pages文件夾下的全部任務,根據其中設定的時間利用node-schedule這個庫註冊定時任務,任務的具體就是啓動一個子進程執行pages文件夾中的js文件。而且監聽子進程返回的消息,也就是數據。其中利用了async來處理各個任務的併發執行。工具

fex-weekly中邏輯並不能通用,因此假如你要抓取別的站點的文章,那麼你得建立一個新的文件,而且寫相應的邏輯。按着必定的數據格式(目前的格式尚未統一)給pageSpider。目前抓取FEX團隊的文章邏輯是先利用request包發送請求獲取文章列表,利用cheerio(能夠理解爲$)解析dom節點獲取文章url,而且發送請求獲取每篇文章的內容,併發送給pageSpider。其中也利用了async處理併發獲取文章的任務。url

4、以後

整個pageSpider就說清楚了,以後會把75team部分補上,添加郵件功能,以後還可能會添加把抓取的文章轉換成爲kindle能夠識別的格式。這樣就能夠在kindle上接收到想看的內容了。想一想都以爲挺方便的呢。若是你對這個代碼感興趣,能夠移步github進行fork改造或者關注新功能。spa

相關文章
相關標籤/搜索