爬蟲專案常見問題及解決方案

simon4545發表於2016-09-21

最近在做一個採集國內的視訊網站內容的爬蟲專案,在開發的過程中遇到了一些典型問題,在這裡羅列下來和大家一起分享:

問題一:用什麼語言寫爬蟲最好?

關於這個問題,我無法給出正確的答案,我最終選擇的是Node.js.原因如下:
1.我們團隊對Java,Python,Node.JS都比較熟悉,但因為採集資料不少都是JSON介面,我們選擇了和JSON最融洽的Node.JS.

2.Node.JS不是天然的多執行緒或協程的解決方案,採集的效率不高?這裡我是這麼理解的,Node.JS是天生的非同步程式設計模型,我們的採集最大多數的時間還是用在網路上,在這段時間可以同時發起多個HTTP請求,並等待最終的結果,CPU利用率並不需要太高,所以這一點來看,Node.JS並沒有什麼劣勢。

3.Java,Python都有完善的爬蟲框架,為什麼不用?我們這個專案算是定向採集,非廣度優先,我們梳理完需求,發現我們最基礎的需求,只是 能使用代理,能重試連線,能設定超時,能處理異常,而這些問題在Node.JS裡,requestretry這個庫都已能解決,所以我們並不需要一個大而全的框架,處理佇列,分散式等問題,選一個最熟悉的能用的才是最合適的



問題二:用什麼資料庫最好?

我們最終選擇的是MongoDB,但這不是最好的選擇

1.為什麼拋棄Mysql之類的關係型資料庫?
爬蟲的結果五花八門,但我們後期要對資料進行清洗,需要更為視覺化的資料結構,MongoDB之類的Document型資料庫會更加易用。同時,因為專案的需求後期可能會變更,我們會把原始資料儘可能完整的儲存起來,以供後面的需求,MongoDB強大的文件查詢能力,可以為後期的清洗省很多事


2.為什麼不用elasticsearch,Hadoop?

elasticsearch看起來是個不錯的選擇,它是一個具備很強內容檢索能力的搜尋方案,後期,我們可以很方便的為視訊的內容打標籤。但它對我們來說太重了一些,我們並沒有用到它的30%的功能

Hadoop也是這幾年很牛很火的大資料儲存和檢索的解決方案。同樣的,它依然太重了,對我們來說。

我們每天入庫700萬條記錄,這個其實壓根算不上大資料,殺雞何必用牛刀,而且elasticsearch,Hadoop如果不做叢集,就讓自已都產生內疚“這麼牛的東西,你只單機跑,丟人不”?所以我們只用了MongoDB,做主備就結束了,因為清洗完的資料,已被移走了。


3.MongoDB為什麼不是最好的選擇?

眾所周知,MongoDB是記憶體對映型的文件資料庫,一般意義上理解就是“吃記憶體”。我們採集來的原始資料,也會被對映到記憶體中,這是很浪費的,因為我們只需要當天夜裡清洗完之後就不再需要這些原始資料。而隨著採集的資料不斷增加,記憶體佔用會越來越高。我們正在計劃往LevelDB遷移。LevelDB是基本Google的BigTable發展出來的硬碟型資料庫,對於記憶體的利用會更高效一些,雖然它的查詢能力並不如MongoDB,但我們畢竟不是實時型的應用。




問題三:爬蟲代理

不少的平臺都有反爬蟲的方案,無非是限制帳號訪問次數或限制ip的訪問頻次,後者居多。

最開始的時候,我們選擇了網上的收費http代理,百度搜了一個叫全網代理IP的平臺,網址是http://www.goubanjia.com/,但實際使用中,可以說非常的垃圾。提供100個http代理,只有3,5個能用的,而且速度很慢,同時它們網站訪問慢如龜速,客服態度也不行,只要在群裡反饋就直接踢人。後來,換了一家叫快代理的,速度並沒有好多少。結論:“網上買http代理絕對不是爬蟲代理的好方案”。

最後我們找到了解決辦法:

現在許多雲主機服務商,都有彈性IP的功能,就是說,你可以申請N多個IP,一個月只需要基本使用費20多塊錢,在爬蟲過程中,用雲平臺的介面,換ip去採集,高速穩定。



相關文章