本文轉(zhuǎn)載自簡書小溫侯
原文鏈接:http://www.reibang.com/p/61fe5b9320ac
上個月初兆解,我入職了一家公司,正式開啟了我的爬蟲職業(yè)生涯跑揉。雖然之前自學或者說自己鉆研并編寫了很多爬蟲锅睛,不過當我第一次見到一個完成的爬蟲系統(tǒng)的時候,坦白說历谍,還是覺得挺不可思議的现拒,我大概花了2到3個禮拜對這個系統(tǒng)進行了熟悉,現(xiàn)在在保持對原系統(tǒng)的進行維護的同時望侈,正著手對其進行性能優(yōu)化印蔬。隨著理解的深入,我越發(fā)覺得爬蟲工程師的瓶頸其實并不是JS脱衙、css之類的前端反混淆技術(shù)侥猬,也不是requests、BeautifulSoup之類的網(wǎng)頁獲取解析技術(shù)捐韩,當然也不是僅僅對爬蟲框架的使用退唠。這些技術(shù)固然是必須的,但是真正的上升瓶頸還是工程師的素養(yǎng):如何寫出一個高性能可擴展的爬蟲系統(tǒng)荤胁?系統(tǒng)如何兼容數(shù)百個甚至數(shù)千個不同類型的爬取對象(網(wǎng)站)瞧预?如何管理這些爬蟲?如何高效的并發(fā)這些爬蟲?如何處理爬取之后的數(shù)據(jù)垢油?各個子系統(tǒng)之間如何交流盆驹?和這些問題比起來,對某個特定網(wǎng)站的爬取的問題只能算是個入門級問題秸苗。
對爬蟲工程師的理解
我之前寫了很多關(guān)于爬蟲的文章召娜,涉及了各種各樣的爬取策略;也爬了不少主流非主流的網(wǎng)站惊楼。從我剛?cè)腴T爬蟲到現(xiàn)在玖瘸,每一個爬蟲對應(yīng)的文章都可以在我的博客上找到,不論是最最簡單的抓取檀咙,還是scrapy的使用雅倒。
然而爬了這么多網(wǎng)站,按理說應(yīng)付一位爬蟲工程師的工作應(yīng)該綽綽有余吧弧可?當然不是蔑匣,正如我上文所說,在整個爬蟲系統(tǒng)中棕诵,如何抓取某個特定的網(wǎng)站其實是最小的任務(wù)模塊裁良。而對于一個有爬蟲需求的公司而言,一個能夠長期穩(wěn)定運行的爬蟲系統(tǒng)才是基本需求校套。
我從另外一個角度解釋一下這個問題价脾,如果我們將“爬取某個頁面”稱為一個爬蟲任務(wù)。那么一般而言笛匙,我們會需要定期執(zhí)行這個爬蟲任務(wù)以滿足業(yè)務(wù)上的需求侨把。比如說,我這有一個爬蟲任務(wù)是“爬取某只股票的當前價格”妹孙,那么我可能會要求每10s執(zhí)行一次這個爬蟲任務(wù)以達到匯至股價走勢的目的秋柄。問題就來了,爬蟲系統(tǒng)如何保證每10s執(zhí)行這個爬蟲任務(wù)呢蠢正?time.sleep(10)? crontab骇笔?open_signal?send_task?
最簡單的嚣崭,你可以讓程序執(zhí)行一次爬蟲任務(wù)后sleep10秒蜘拉,然后無限重復這個循環(huán)。嗯有鹿,如果只有一個任務(wù),理論上是可行的谎脯,此時這個程序就是一種爬蟲系統(tǒng)葱跋。那么比這種解決方案略微高端一點的就是寫一個定時任務(wù),每10秒執(zhí)行一下,這下連爬蟲系統(tǒng)都省了娱俺。
但是如果這種爬蟲任務(wù)有很多呢稍味?比如說,我要繪制1000個不同股票的股價走勢圖荠卷。簡單一點的可以將爬蟲任務(wù)改成可接受參數(shù)式的模庐,每10s中傳入1000個參數(shù)(股票代碼)并用多進程或異步執(zhí)行這些任務(wù)。用scrapy也可以解決這個問題油宜,scrapy其實非常適合這個場景掂碱,但是scrapy沒有定時任務(wù),這個時候可能又會需要用到scrapyd和celery慎冤。接著疼燥,如果有100W個爬蟲任務(wù)呢?雖然有些爬蟲只需要簡單調(diào)整一下參數(shù)蚁堤,這些任務(wù)可以當成同一類爬蟲醉者,但即使去除這些同類型爬蟲,仍然會剩下不同類型的爬蟲任務(wù)披诗,比如說30W撬即?那么這30W個任務(wù)我們怎么處理,不可能在一個scrapy里寫30W個spider呈队?然后還會涉及到調(diào)度剥槐,因為每個爬蟲的抓取頻率可能是不一樣的;管理掂咒,爬蟲任務(wù)可能會根據(jù)產(chǎn)品需求出現(xiàn)增刪的情況才沧;爬取結(jié)果處理,比如說去重(對100W個結(jié)果去重本身也是個不小的事情)绍刮、存儲等等温圆。
另外,一個健康的爬蟲生態(tài)孩革,一般還需要一個代理池岁歉,一個網(wǎng)頁渲染服務(wù)器,像爬微博的話可能還需要Cookie池膝蜈,然后這個系統(tǒng)本身應(yīng)該是高可用高可擴展的锅移。隨著爬蟲任務(wù)數(shù)量的增加,各個地方都有可能產(chǎn)生性能瓶頸饱搏。這也是我為什么說非剃,爬取任務(wù)其實是最小的一環(huán),對于單次任務(wù)的執(zhí)行速度推沸,甚至有時候它的成敗都不是關(guān)鍵备绽。
插一句券坞,scrapy仍然是一個很強大很厲害的框架,它是我目前認知里最牛逼的爬蟲框架肺素。它的厲害不在于它可以方便的編寫一個爬蟲恨锚,而是它的模塊定制功能,你可以根據(jù)實際的產(chǎn)品需求倍靡,通過調(diào)整中間件或者調(diào)度器方便的實現(xiàn)你想要的功能猴伶。
但是有時候偶爾會出現(xiàn)一些反爬特別厲害的網(wǎng)站,這個時候就需要對其進行單獨的研究了塌西。另外他挎,我以為手機端抓取其實是一個很關(guān)鍵的手段,現(xiàn)在的手機性能強大雨让,能做的事情實在是太多了雇盖,只是大多數(shù)時候被人忽略了。個人以為這可能會變成今后一個主流的抓取手段栖忠。今后我也會開始學習這方面的知識崔挖。