全網最全網絡數據採集(爬蟲)指南

本chat主要從以下6個方面來展開

  • 爬蟲的來由,應用場景,數據價值
  • 爬蟲技術開發語言和開發框架選型
  • 爬蟲國內外產品競品分析
  • 爬蟲技術應用延伸拓展
  • 分佈式企業級爬蟲實踐

首先本chat旨在讓大家對爬蟲形成,價值,實現,周邊等有一個全面的認識,而不是事無鉅細的講解爬蟲的各種具體實現,如果大家有這方面的興趣和具體爬蟲問題可以線上和建微信羣就交流


1、爬蟲的來由,應用場景,價值

這是一個爬蟲肆掠橫行的年代,且看各種爬蟲教學視頻,付費課程大行其道,甚至搭着數據挖掘分析和大數據一起,着實很緊俏,話說筆者也是這個行業的一個資深的爬蟲老人了,在此也不羅嗦,趕緊把爬蟲的各種道道,技術流派和淵源給你梳理講講。

話說這世上本沒有爬蟲,只是因爲有了web,纔有了爬蟲,是的,目前市面上說的爬蟲基本上是圍繞web網頁的,甚至很多技術棧和框架也是圍繞web技術趨勢來發展的,但只是其一,目前也有很多圍繞app來做的爬蟲,當然實現起來也就更難了,這裏後面會細細道來,其實在談數據採集之前,我們應該先思考另外一個問題,爲何採集爬取數據,只有回答了這個問題,才能理解爲什麼爬蟲這個行業這麼火爆,在嚴刑峻法之前依然有這麼多前仆後繼,我是這麼理解的,圍繞數據採集有以下使用場景,且有利益輸送,在列舉之前,不得不說,這是一個大數據的時代,數據就是價值就是金錢(你肯定反駁那不一定非得爬呀,只能說你太年輕,有數據的公司太少了,畢竟不是BAT:

  • 1、搜索引擎公司,不得不說,谷歌百度等搜索引擎公司是最大的爬蟲公司,只不過別人找到了目前截止目前信息時代數據最好的變現商業產品而已。
  • 2、輿情分析,這絕對是爬蟲數據被綜合利用設計後很好的實現場景之二,比如百度,谷歌,搜狗,微博等排行榜或者輿情分析產品。
  • 3、買數據的公司,或者數據聚合的公司,比如天眼查,企查查,西瓜數據等等。
  • 4、導購,價格監測,運營助手,或者橫向數據聚合的公司等,以此爲生的產品衍生的小公司就不一一列舉了。
  • 5、黑產,灰產,刷量,排行榜,搬磚等,比如前期被判刑的美劇天堂還是什麼公司就是這樣的,這樣的個人,團伙也是不少的。
  • 6、廣告公司,比如新榜,清博數據等圍繞微信,微博等社交媒體的公司。

總之以此爬蟲拿公開或者非公開的數據價值來爲自己賺錢即是人性,所以你很難說把這個行業給消滅掉,話說還有很多公司是希望自己的產品被人爬呢?只要在法律的準繩之內,遵循robots協議,大家還是可以很好的玩耍的。

反正已經囉嗦了這麼多,我們還是繼續來說爬蟲和大數據的關係吧,上面也講了,真的有很好的數據覆蓋面的公司畢竟不多,講到了數據,以我有限的經驗來說,企業的數據無非有以下幾個來源:

  • 1、數據庫(這裏的數據庫是泛指,有可能是文件,關係型數據庫或列存儲數據)裏數據,包括自己的業務數據,價值密度應該最高的。
  • 2、埋點數據,當前以友盟,百度,talkingdata等爲首的web或者app埋點數據廠商,當然也可以自己開發埋點數據工具來收集數據。
  • 3、日誌數據,包括系統,應用,網絡等數據,價值密度相對較小,這裏也涉及到很多技術,後面公司會單獨來聊聊。
  • 4、爬蟲或者外部採集數據,對,網絡採集數據作爲企業內部數據一個很好的補充,也是有相當價值的,這也是爲什麼很多公司有專門的爬蟲公司一職。

2、爬蟲技術語言和技術框架選型

1、python

a)、談到爬蟲具體的實現框架,我首推python語言家族的scrapy,沒有之一,當之無愧的爬蟲一哥,作爲爬蟲框架,他可擴展性,易用性,穩定程度都極佳,如果非得找一點缺陷,那就是性能和分佈式這塊相對單薄了一點,但作爲底層的數據抓取已經可以勝任一般企業的爬蟲需求,這裏推薦一個組合 scrapy + scrapyd + celery,味道極佳,至於具體如何操作,後面的章節會一一道來。

b)、第二推薦的當然是pyspider,作爲國內大神開源的爬蟲框架也是可圈可點,小巧,易用,高效,但在穩定性和可擴展以及功能豐富程度上上在我看來不及scrapy。

以上兩個是我極力推薦的兩個python爬蟲框架,至於其他工具或者類庫,比如requests/xpath等頁面請求解析庫等更是數不勝數,具體場景撿適當的來補充即可,對於靈活性和場景多變,且對於穩定性有較高要求的場景我建議優先使用scrapy框架,其餘情況可以考慮pyspider,畢竟更容易上手,拿來即用,用完就走哈。

2、java和go

其實以我看,jvm體系下的編程語言,特別是java,目前還沒有一款一統天下的爬蟲框架,比如webmagic,spiderman2,crawler4j,Gecco,SeimiCrawler,nutch等等,至於以上的每個java爬蟲框架我基本都有涉獵,其中個人覺得spiderman2作爲學習java是一個不錯的框架,代碼範式和風格很漂亮,對於要提高自己java編程能力的同學可以反覆研讀一下,其次webmagic作爲java體系下的爬蟲框架,據我所知,國內不少同學比較喜歡它,最後說下nutch,其實它更像一個搜索引擎,但大部分情況被當做爬蟲框架來用,也是衆多框架下唯一一個真正意義上支持分佈式的,底層是採用hadoop來做,特別是nutch2.x以後,使用gora支持衆多底層存儲,但是,請注意,我要說的是,爲什麼java作爲爬蟲開發語言,我以爲是不太合適的,作爲一門編譯型的靜態語言,儘管在效率上有優勢,但還是顯得過於笨重,特別是爬蟲所面對的複雜多變的場景,在這裏我就不一一闡述每一種java框架的具體使用,大家如果有使用上的問題可以線上和建羣交流。

3、nodejs

對,我把nodejs作爲第三種合適爬蟲開發的編程語言,有可能java和go語言開發的同學不服,但是nodejs纔是爬蟲的親兄弟啊,比較nodejs底層是跑在瀏覽器上,所以從血緣上來看,它處理網頁數據肯定是得心應手啊,儘管也有不少nodejs的爬蟲框架,但缺乏殺手級爬蟲框架,其實這很重要,尤其這種大殺器級別的應用,甚至能帶動一門編程語言的發展,比如docker/k8s之於go, spark之於scala,這裏還是列舉一些我試用過的nodejs爬蟲框架:
headless-chrome-crawler 這是一位日本小哥開發的
node-crawler
感興趣的同學可以嚐嚐鮮,
這裏打個廣告,個人基於nodejs開發的一個爬蟲小產品年後會發布上線

到此,爬蟲編程語言和框架的選型上就到這裏了,如果在語言不是問題的前提下,開發生產或者企業級爬蟲應用,我的建議是:

python > jvm體系 + go > nodejs

首先考量的不是性能問題,而是語言的匹配程度上,首先得考慮可調試維護性,成本和穩定性上,爬蟲很多情況下,是多變的,反爬引起的朝夕改,動態解釋型的腳本語言更合適。

3、爬蟲產品競品分析

首先我來翻一下國外的爬蟲和數據挖掘的公司:

1、diffbot

這是被騰訊資本加持的一家人工智能公司,通過人工智能技術,讓“機器”識別網頁內容,抓取關鍵內容,並輸出軟件可以直接識別的結構化數據,並且該公司號稱自己擁有業界最大的知識圖譜,怪不得它能被騰訊看上,敢情是披上了人工智能的外衣的高級數據採集公司,目前該公司擁有三款產品,主要是saas模式,算是目前瞭解的爬蟲技術公司裏博得頭籌的一家公司了,當然一些大廠,比如谷歌,雅虎內部也有這樣的系統,但沒有輕易示人。

2、import.io

相比較diffbot,這家爬蟲技術公司從產品到解決方案輸出,還是覆蓋得比較全面,同時也提供了強大的可視化爬蟲界面,少卻了人工智能的馬甲,也是爬蟲界裏踏踏實實的一家公司了,主要模式也是saas,同時提供數據抽取解析轉換,然後通過api的方式輸出,至於用到的技術還沒發深入細究。

3、scrapinghub

官網:https://scrapinghub.com/,它作爲scrapy開源框架背後的商業公司,首先給一個大大的贊,畢竟把scrapy這麼優秀的爬蟲框架開源了,還是造福了不少爬蟲工程師啊,只不過scrapinghub作爲雲上版本,退出了一些付費服務,包括代理ip,splash,cloud等,同時scrapinghub的開源版本也提供了portia這樣可視化的功能,相信對於不少爬蟲小白還是相當友好的,但個人認爲使用場景有限,如何玩轉scrapinghub,我也會在後續的爬蟲技術篇中幫大家一起來梳理實戰一下,總之對於想從事爬蟲事業的同學來說,這個項目和產品是不得不關注的。

4、apify

該公司提供的產品從頁面和功能,就是我比較喜歡的範,簡單大方實用,爲什麼實用呢?首先它的定位就是面向一線開發者,提供了利用js代碼實現爬蟲邏輯,我這裏不是說可視化爬蟲技術就多麼不好,只是我理解爬蟲從一開始就不是一個人人可用可玩的玩具或者消費品,當然我後面也會講爲什麼我這麼理解,既然提供了可編程的模式,我相信apify的實用性,同時apify也提供了一些類似actor這樣的高級特性,筆者猜測只是使用了一些虛擬化的技術來讓實現租戶資源權限隔離。

國外的公司就先列出以上這四家比較具有代表性的公司,其它大大小小的公司肯定也是不少的,在此就不一一列舉了,接下來該上點中國菜了。

5、神箭手

作爲國內我首推的爬蟲技術公司,它的定位是大數據+AI的雲os,定位歸定位,我看到的它只是一家賣爬蟲和數據的公司,AI能力我反正是看不到,就不和diffbot做比較了,實在沒有可比性,當然作爲國內市場的爬蟲一哥,它也是有自己獨特之處的,比如它也提供了js可編程能力的爬蟲視窗,而且最近也提供了基於scrapy框架的雲爬蟲開發環境,說白了,他們提供的js開發爬蟲環境功能湊合,筆者也是做了專門研究,底層不是使用v8引擎來實現的,而是通過java8的Nashorn引擎做的,整個技術棧基本圍繞java+php,但我還是覺得他們產方向和定位還是不錯,還需要提升自己來打破市場證明自己。

6、八爪魚

作爲深圳的一家爬蟲技術公司,和神箭手的定位還是有所差異,畢竟從產品設計上來看,神箭手更偏互聯網化,而八爪魚更像是在提供一個工具,面向B端客戶,更保守一點,同時也提供了可視化客戶端幫助爬蟲小白快速入手,也提供了一些行業解決方案,儘管它也提供了saas收費模式。

7、造數

從官網和產品設計風格來看,該公司主打的是可視化爬蟲和互聯網玩法,但不得不說,產品功能稍顯粗糙,且對於爬蟲的理解不是非常深刻,有可能是我瞭解的比較片面吧。

以上也分析了國內國外7家爬蟲產品,基本內核就是將web的非結構化數據結構化的工程,只是說使用的技術和產品表達形式有差異而已,不管你是用人工智能深度學習,亦或是無監督的機器學習算法,還是使用簡單粗暴的方式,解決的只是規模化和人力成本問題,但願這些對你有所啓發,到此產品競品篇以結束,也許還很淺薄,但願後面還能有時間精力把這些競品分析得更徹底完整一點吧。

最後也談下我對國內外做此類產品的一點差異吧,國外確實比國內要高不少,同時大家也能看出來純粹地做爬蟲技術平臺,沒有特別大的公司,或者直接說不值錢,而以爬蟲技術作爲基座,上面做出解決問題的應用或者產品才能做大做強,在某些時候這或許就是技術或者技術人的悲哀吧。

4、爬蟲相關技術延伸與拓展

前面漫談了網絡數據採集系統的使用場景,價值,以及不同語言開源框架技術實現選型,以及國內外商業化爬蟲產品的競品分析,本章繼續沿着這個方向和大家講講爬蟲所涉及到的技術除了能夠採集網絡數據,還能做什麼,包括前面也有提到,所謂的爬蟲主要泛指web數據採集,其實還有一個方向就是app數據採集,網絡數據採集的技術方案,除了能夠採集數據以外,與此一脈相承的還有就是頁面自動化測試,再就是app真機雲端自動化測試等領域;

關於web方向做自動化測試我這裏提出兩個常規且使用廣泛的框架:

1、selenium

Selenium automates browsers. That's it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) be automated as well.

你沒看錯,本來作爲web自動化測試框架,但硬生生被廣大爬蟲工程師給整成了一個爬蟲框架,selenium功不可沒,[這裏插入一段selenium的專業解釋],這裏還是要歸功於當前各大瀏覽器廠商均提供了web driver api的方式來提供遠程自動化操作瀏覽器,不管你頁面多複雜異步的頁面,頁面的反爬邏輯多複雜,只要祭上selenium,一切均消失於無形,因爲它讓你可以真實地模擬人在操作,當然這其中的注意事項和操作細節就很多了,如果說scrapy是我心目中處理同步頁面最全面最好用的爬蟲框架(儘管也提供了splash解決方案),那麼selenium則是處理異步網頁數據抓取的最佳選擇了,至今也是使用最廣泛的異步或者複雜網頁的數處理方式,而且也提供了java/python/js等三種語言的sdk,同時也提供了selenium grid等解決方案,還很貼心提供了docker解決方案。

2、puppeteer

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless)Chrome or Chromium.

其實在沒有puppeteer之前,在*uix環境上搭建一個selenium的環境還是很麻煩,因爲需要顯卡驅動等,但是puppeteer本來就作爲一個non-headless(無頭瀏覽器)解決方案,一切那麼順利成章,而且puppeteer作爲後起之新秀,自然是革命家,比如在此之前nodejs的解決方案是phantomjs/CasperJS等,但自從谷歌官方出了puppeteer出現之後,phantomjs作者官宣停止開發了,所以大家在選擇nodejs作爲自動化和爬蟲解決方案自然是知道該如何抉擇了,這裏不得不提下,雖然這也會吃掉selenium的一部分市場,畢竟相較在api的豐富程度和性能上selenium還是有所單板的,但就語言支持度和穩定性以及存量市場上等生態上selenium還是我的第一選擇。

介紹完了web自動化測試和異步網頁(也能處理同步)的兩個top級框架和解決方案,下面來講講app的自動化測試和抓取解決方案

1、appium

Appium is an open source test automation framework for use with native, hybrid and mobile web apps. It drives iOS, Android, and Windows apps using the WebDriver protocol.

2、macaca
Automation test solution for native, hybrid, mobile web and web application on mobile and desktop platforms.多端自動化測試解決方案

因爲以上兩個解決方案,從產品定位到技術實現基本差不多,我就不單獨一一介紹了,分別使用android adb 遠程命令行 + ios driver等作爲基本底層解決方案,只是使用nodejs 提供了上層的api,大家如果要嘗試,我還是建議使用appium來動手實踐一下,說了這麼多,拋開自動化測試,迴歸到爬蟲上,似乎忘記交代了一個背景,既然有以上那麼多數據採集框架,爲什麼還要用app這種採集方式,如此繁瑣麻煩,比如微信數據採集,作爲一個基於app的封閉式的數據區域,你必須採用這種非常手段。

分別講完了異步web頁面和app的自動化與數據採集方案,再延伸講一下,比如雲端羣控,微信機器人,rpa機器人等自動化領域也基本使用了相同的技術棧,這裏我分別使用相關案例和大家介紹下,讓大家有個基本的概念:

1、wechaty

作爲一個hook微信協議,並採用typescript開發的微信機器人框架,並實現了web/ipad等不同平臺的微信羣管理,自動對話等功能。

2、openstf

本身作爲一個雲端真機的自動化管理和測試平臺,但也可以實現目前大家所熟知的雲端羣控系統。

3、rpa的商業版本的最佳範例

比如阿里巴巴的碼棧,作爲阿里官方出品的一個服務淘寶商家的商業機器人產品,在其它行業也有很大的複製可能性。

聊到這裏,關於由爬蟲技術衍生的技術內容基本講完了,外行看熱鬧,內行看門道,以上三篇作爲網絡數據採集的漫談篇,基本上也講完了,其實對於以爬蟲技術作爲翹板,有很多可以想象的商業化的空間和生財之道,就看大家是否要做這有意爲之的有心人了,從下篇開始,講爲詳細介紹各種爬蟲的技術實現細節和設計,並附上業界最有實戰意義的案例源碼講解。

5、企業級分佈式爬蟲架構實踐

假設目前我們的一個客戶需要這樣的一個數據採集系統:

  • 1)、採集數據包含不帶身份認證的天貓商品列表頁面,包含帶身份(需要登錄)的後端頁面數據,數據覆蓋京東,天貓,蘇寧等。
  • 2)、採集系統需要有快速的可編程能力的界面,幫助他們能夠快速調試,糾錯,而無需走完一個完整本地開發,測試,發佈的流程。
  • 3)、採集系統需要有完整的抓取運行日誌,採集數據統計,爬蟲異常原因診斷分析,容錯重試等。
  • 4)、爬蟲任務需要有靈活的參數配置,豐富的時間調度設置,任務粒度切割功能。
  • 5)、爬蟲需要有針對業務靈活的併發控制,頻率設置,支持多機分佈式執行。
  • 6)、爬蟲數據支持多種存儲方式,比如oss對象存儲做離線分析,rds存儲做實時分析等。

bala bala,反正客戶提出的需求,不管是合理,還是無理,不管是好做,還是不好做,,絕對不會讓你好受;
注:以上是筆者接觸到一個真實的客戶對於數據採集系統的各種要求,筆者在倍受客戶厚待的toB創業公司。
如果你接觸到客戶提出這麼多的要求,你會怎麼做,下面我給出我的解決方案,爲了避免重複造輪子,我們可以從目前已知的開源技術裏去找找看,相信讀過我前面漫談篇的同學肯定猜到了我接下來要說什麼了,是的,今天就是要和大家說說如何利用scrapy+scrapyd+celery[django apscheduler]來完成以上的功能的架構和實踐。

這裏不得不提,我心目中開發爬蟲,或者更準確來講,頻繁變更的數據抓取腳本型語言一定是最合適,比如python/nodejs,所以在語言和框架選擇上非python莫屬了

既然要求分佈式,易部署,而且需要可視化管理界面,那麼從工程組織上講,主要分爲兩塊,admin與engine,其中admin又因爲前後端分離,接口部分和頁面部分,接口部分當然是採用django了,頁面部分採用react也是很好的選擇,engine作爲腳本執行容器,本來是準備用golang來寫的,但考慮到技術棧的統一,scrapyd正好彌補了這個缺口。

客戶還要求爬蟲任務調度的功能,且考慮到分佈式,而celery作爲python語言家族最好的分佈式任務框架,自然是最佳選擇,但整體評估下來,celery畢竟比較重,又依賴了redis和rabbitMQ,同時在調度表達式上還是不夠靈活,遂改爲django+apscheduler,小巧,靈活,同時技術棧上也比較統一,容易駕馭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章