從 0 到 1 帶你搭建 Java 并發(fā)爬蟲框架(一):爬蟲原理和流程
私下里有不少童鞋在問爬蟲框架的問題,這也是測(cè)試童鞋轉(zhuǎn)測(cè)試開發(fā)或開發(fā)一個(gè)比較好的練手項(xiàng)目,為什么這么說呢?如果你之前已經(jīng)有WEB自動(dòng)化測(cè)試或接口自動(dòng)化測(cè)試的經(jīng)驗(yàn),那么很多技術(shù)點(diǎn)在爬蟲中也能夠應(yīng)用得上,比如頁(yè)面分析,元素定位,接口HTTP請(qǐng)求,JSON解析,頁(yè)面解析等等……此外通過這個(gè)實(shí)戰(zhàn)項(xiàng)目,你還可能學(xué)會(huì)爬蟲的原理和流程,如何整合項(xiàng)目,如何使用并發(fā),數(shù)據(jù)如何處理,分層框架如何搭建等等……接下來這段時(shí)間就從實(shí)戰(zhàn)的角度分享下如何從 0 到 1 一步步搭建 Java 并發(fā)爬蟲框架,大概的篇章是這樣的(具體會(huì)根據(jù)篇幅大小來增減):
入門篇:
一、了解爬蟲的原理與流程
實(shí)戰(zhàn)篇:
二、新建 SpringBoot 項(xiàng)目
三、構(gòu)建免費(fèi)代理服務(wù)
四、HTTP 請(qǐng)求封裝
四、實(shí)現(xiàn)業(yè)務(wù)爬取邏輯
五、集成Bomb云數(shù)據(jù)庫(kù)
六、構(gòu)建任務(wù)調(diào)度

為什么要了解爬蟲?
“數(shù)據(jù)是新一輪技術(shù)革命最重要的生產(chǎn)資料”,在互聯(lián)網(wǎng)行業(yè)可以近似的說擁有了數(shù)據(jù)就擁有了市場(chǎng)。爬蟲在互聯(lián)網(wǎng)上無處不在,國(guó)內(nèi)外的各大搜索引擎都是基于爬蟲抓取信息后檢索的,所以說 “互聯(lián)網(wǎng)上 50% 的流量都是爬蟲創(chuàng)造的” 這一點(diǎn)都不為過。近 2 年爬蟲技術(shù)跟隨著大數(shù)據(jù)的火熱逐漸從臺(tái)后走到臺(tái)前,被越來越多的人所熟知,也被應(yīng)用的越來越廣泛,小到個(gè)人利用爬蟲抓取數(shù)據(jù)分析建模,大到利用爬蟲構(gòu)建公司的內(nèi)容和數(shù)據(jù)生態(tài)圈。所以爬蟲已經(jīng)成為一門 “平民化” 的技術(shù),大家在工作和學(xué)習(xí)中都有用得著的地方。
爬蟲的原理與流程
本篇重點(diǎn)是要講述如何構(gòu)建爬蟲框架,但考慮到大家的對(duì)爬蟲的了解程度不同,所以還是稍微帶一下爬蟲的原理和流程。
爬蟲的原理其實(shí)很簡(jiǎn)單,其實(shí)跟在瀏覽器中輸入一串 URL 地址并按下回車鍵后發(fā)生的事情是一樣的(對(duì)于這個(gè)問題的理解有興趣的童鞋可以參看:在瀏覽器中輸入 URL 地址并回車后都發(fā)生了什么?),只不過爬蟲的這些操作是用代碼來實(shí)現(xiàn)的。
爬蟲的主要目的就是爬取目標(biāo)數(shù)據(jù),但是為了達(dá)到這個(gè)目的,還需要很多輔助工作要做,比如前期的目標(biāo) URL 提取或頁(yè)面分析,繞過登錄限制,以及爬蟲身份的隱藏、爬蟲的調(diào)度和容錯(cuò)處理等,還有最后的數(shù)據(jù)清洗和入庫(kù)。一個(gè)完整的爬蟲程序應(yīng)該是包含分析、爬取到入庫(kù)等一系列流程的,為了直觀我就畫一個(gè)圖來表示:

當(dāng)然上面只是一個(gè)單線的爬蟲流程,如果考慮到分布式和并發(fā)功能等,還需要繼續(xù)加上任務(wù)調(diào)度功能。比如前期已經(jīng)解析出了 URL,并發(fā)現(xiàn)了 URL 的數(shù)據(jù)分頁(yè)關(guān)系,假定用 pageNumber 來表示分頁(yè) index,那么完全可以一次并發(fā) 10 個(gè)線程去跑 10 個(gè)任務(wù),每個(gè)任務(wù)就是爬取指定 URL 的的數(shù)據(jù),這樣就可以大大提高爬取效率。
此外,前面還提到過容錯(cuò)處理,這里也說明一下,爬蟲在爬取過程中有時(shí)可能會(huì)遇到突發(fā)異常,比如目標(biāo)服務(wù)器異常、網(wǎng)絡(luò)異常、對(duì)方實(shí)施了反扒策略等,這種情況我們也需要分別考慮到,通常需要加入重試機(jī)制,你可以自己定義什么類型的異常需要加入重試,比如請(qǐng)求失敗,這可能被對(duì)方屏蔽了,也可能網(wǎng)絡(luò)出現(xiàn)了震蕩。所以這時(shí)候重試 2 次看看,如果重試還是失敗,那么就可以放棄這次爬取任務(wù)了,你可以將失敗的任務(wù)記錄下來,后面等空閑或等實(shí)現(xiàn)失敗任務(wù)定時(shí)調(diào)度功能,等待下一次的再次調(diào)度;并設(shè)置一個(gè)最大的調(diào)度失敗次數(shù)(比如 3),超過這個(gè)次數(shù),移除這個(gè)任務(wù),以后都不用考慮了。
另外對(duì)于頁(yè)面數(shù)據(jù)解析,要分 2 種情況,提取的種子 URL 請(qǐng)求后返回的是 JSON 或 XML 格式的,直接用 FastJson 來解析 JSON 即可,可是通常沒有這么方便,很多時(shí)候需要我們?nèi)ソ馕鲰?yè)面的 HTML 文檔,這時(shí)候就需要用到 jsoup 來解析頁(yè)面,從而拿到我們需要的數(shù)據(jù)。這些流程中具體的功能和問題都會(huì)在后面的框架搭建時(shí)體現(xiàn)。
下篇預(yù)告:爬蟲框架和項(xiàng)目搭建
