從本章開始,我們來講講爬蟲的優(yōu)化.不知道你有沒有遇到這種情況,那就是別人的一天能上百萬數(shù)量級還都是優(yōu)質(zhì)數(shù)據(jù),而同等配置的你的爬蟲一天只有十幾萬而且質(zhì)量還是參差不齊呢?那就是你沒有還好的優(yōu)化爬蟲.在追求爬蟲的極致性能的今天,如何優(yōu)化爬蟲都將是爬蟲愛好者們面對的重要問題。那么,從現(xiàn)在開始,我們將逐步的從起始出發(fā),一步步的為爬蟲更好的爬取信息而努力.
首先,先來聊聊爬蟲是如何從一條命令進(jìn)化到如今的大規(guī)模商用爬蟲的.因?yàn)橹挥辛私饬伺老x的構(gòu)造,我們才能得心應(yīng)手,看病下藥,找到爬蟲的痛點(diǎn),一一解決.首先,最簡單的爬蟲是wget.不要懷疑,wget也是爬蟲,不過是沒有解析模塊和地址調(diào)度模塊的爬蟲罷了.但這樣有個問題,這樣無用數(shù)據(jù)太多而且太占存儲空間.所以我們得解析頁面,通過HTML DOM等各種解析工具從而在讀取到網(wǎng)頁的同時只取出我們所需的數(shù)據(jù),而其他的就丟棄.這樣就極大的減少了存儲空間.所以,爬蟲本身的基本架構(gòu)就類似與這發(fā)展史,分成這么幾個部分:地址模塊.下載與解析模塊.存儲模塊以及核心中樞模塊.
地址模塊主要負(fù)責(zé)提供需要爬取的目標(biāo)地址,不管該地址是爬取過程中發(fā)散得到的還是原有的種子鏈接.通過各種算法決定下一個提供給下載模塊的地址是什么,起到地址調(diào)度分配的功能.這方面我們可以通過url去重以及算法優(yōu)化來提升性能和可用數(shù)據(jù)的占比.
下載解析模塊通過發(fā)送GET/POST HTTP請求給目標(biāo)服務(wù)器來獲得回應(yīng),然后通過上述的各種方式來獲取我們想得到的數(shù)據(jù)。這方面我們可以通過建立DOM樹使用HTML DOM來靈活的選取HTML中的各個元素.
存儲模塊主要負(fù)責(zé)將獲取到的數(shù)據(jù)通過各種方式存儲起來.一般來說,存儲是爬蟲整體架構(gòu)中消耗性能最多的。所以,我們在這上面要下的功夫也就最多.我們的對策就是通過ORM實(shí)現(xiàn)了批量存儲,減輕了存儲壓力然后通過引入中間件,使得解析與存儲模塊分離極大的加速了爬蟲的運(yùn)行效率.
核心中樞模塊是負(fù)責(zé)爬蟲整體的運(yùn)轉(zhuǎn)和各模塊之間的調(diào)度.屬于控制模塊,不參與實(shí)際數(shù)據(jù)的處理.
大概運(yùn)行邏輯是這樣的:
從流程圖中我們也可以看到,現(xiàn)在各模塊都纏繞在一起,這樣就會造成很大隱患.例如爬蟲部分模塊癱瘓后會蔓延至整體模塊..所以,我們要引入中間件,不僅僅是為了分離模塊來達(dá)到加速的問題,同時通過將各模塊之間拆散用中間件相連,可以有效的防止整體程序都出錯的可能.而加入中間件之后的流程圖見應(yīng)對性能瓶頸的消息隊列章.
爬蟲的構(gòu)造我們已經(jīng)明了了。那么你心在心里有了什么優(yōu)化的想法呢?沒有也不要緊,接下來我們會逐步的根據(jù)爬蟲的不同模塊進(jìn)行針對性的優(yōu)化.敬請期待.