數據從業者必讀:抓取了一千億個網頁後我才明白,爬蟲一點都不簡單

2021-01-12 36氪

編者按:網際網路上有浩瀚的數據資源,要想抓取這些數據就離不開爬蟲。鑑於網上免費開源的爬蟲框架多如牛毛,很多人認為爬蟲定是非常簡單的事情。但是如果你要定期上規模地準確抓取各種大型網站的數據卻是一項艱巨的挑戰,其中包括網站的格式經常會變、架構必須能靈活伸縮應對規模變化同時要保持性能,與此同時還要挫敗網站反機器人的手段以及維護數據質量。流行的Python爬蟲框架Scrapy開發者Scrapinghub分享了他們抓取一千億個網頁後的經驗之談。

現在爬蟲技術似乎是很容易的事情,但這種看法是很有迷惑性的。開源的庫/框架、可視化的爬蟲工具以及數據析取工具有很多,從網站抓取數據似乎易如反掌。然而,當你成規模地在網站上抓東西時,事情很快就會變得非常棘手。

自2010年以來抓取超過1000億個產品頁面,我們將會通過系列文章來分享從中學到的經驗教訓,讓你深入了解從電子商務商店中規模析取數據時所面臨的挑戰,並且跟你分享應對這些挑戰的某些最佳實踐。

本文是該系列文章的第一篇,在這裡我們將提供規模抓取產品數據所面臨主要挑戰的概覽,以及Scrapinghub從抓取1000億產品頁面中學到的經驗教訓。

成立於2010年的Scrapinghub是領先的數據析取公司之一,也是當今最健壯和流行的web爬蟲框架Scrapy的作者。目前Scrapinghub每月抓取許多全球最大型電子商務公司的頁面數超過80億(其中30億是產品頁面)。

對於那些對規模爬取網頁技術感興趣但對要不要建立專門的web爬取團隊或者外包給專門的web爬取公司的人來說,最好看看這個免費指南,企業web爬蟲:規模化web爬取技術指南

規模爬取技術為什麼重要?

跟標準的web爬取應用不一樣的是,規模爬取電子商務產品數據有一項獨特挑戰使得web抓取要困難許多。

本質上這些挑戰可歸結為兩件事情:速度和數據質量。

由於時間通常是限制因素,規模抓取要求你的爬蟲要以很高的速度抓取網頁但又不能拖累數據質量。對速度的這張要求使得爬取大規模產品數據變得極具挑戰性。

挑戰#1——草率而且總是在變的網站格式

這一點很明顯但也許不是最性感的挑戰,但是草率而一直在變的網站格式是目前為止你在規模析取數據時將會面臨的最大挑戰。這未必是因為任務的複雜性,而是由於你要投入的時間和資源。

如果你花過時間開發過電子商務商店的爬蟲的話,你就會知道電子商務網站代碼之草率是一種流行病。這可不僅僅是HTML完構性或者偶爾的字符編碼問題。這些年來我們遇到過形形色色的問題——HTTP響應代碼的誤用,損壞的JavaScript代碼,或者Ajax的誤用:

停掉產品時移除頁面的商店在網站升級後突然間會在404錯誤處理程序返回200響應碼。不恰當的JSON轉義破壞了部分頁面的JavaScript代碼(比如『b0rk』d』),導致你需要用正則表達式來抓取那部分數據。濫用Ajax調用的商店以至於你只能靠渲染該頁面(這會導致爬取慢很多)或者模仿API調用(導致要付出更多的開發努力)來獲得數據。

像這樣草率的代碼會導致編寫爬蟲非常痛苦,但也會使得可視化爬取工具或者自動析取不再可行。

在規模爬取的時候,你不僅要瀏覽成百上千個有著草率代碼的網站,還將被迫應對不斷演變的網站。一條好的經驗法則是要預計你的目標網站每隔2到3個月就會發生讓你的爬蟲工作不了的變化。

這也許看起來不像是多大的事,但是當你規模抓取時,那些事件就會累積。比方說,Scrapinghub有一個規模比較大的電子商務項目大概有4000個爬蟲抽取約1000個電子商務網站,意味著每天可能會經歷20到30次爬蟲失敗。

而且網站在不同地區、語言的變化,A/B測試以及包裝/定價的派生也會製造出各種問題導致爬蟲失敗。

沒有容易的解決方案

不幸的是,不存在銀彈可以徹底解決這些問題。很多時候這只是隨著規模而擴大投入更多資源到你的項目上才能解決的事情。再拿上一個例子來說吧,那個項目有18名全職的爬蟲工程師以及3名專職的QA工程師來確保客戶總能得到可靠的數據流。

不過,你的團隊有經驗以後就會學會如何開發出更加健壯的爬蟲,從而檢測並處置目標網站格式中的異常。

如何處理目標網站有各種布局可能的情況呢?用多個爬蟲也許不是最好的做法,我們的最佳實踐是只用一個產品爬蟲來處理不同頁面布局個各種可能規則和模式。你的爬蟲可配置性越強越好。

儘管這些實踐會讓你的爬蟲更加複雜(我們有些爬蟲有好幾千行),但它會確保你的爬蟲更容易維護。

由於大多數公司日常都需要析取產品數據,等待幾天讓你的工程團隊修復任何壞掉的爬蟲不是可選項。當出現這些情況時,Scrapinghub會利用自己開發的基於機器學習的數據析取工具來作為後備,直到爬蟲修復好。這個基於ML的析取工具會自動識別目標網站的目標欄位(產品名稱、價格、貨幣單位、圖像、SKU等)並且返回想要的結果。

我們會在未來幾周之內發布這項工具以及相關的指導文章,告訴大家如何將機器學習用到你的數據析取過程當中。

挑戰 2:可伸縮的架構

你將面臨的第二個挑戰是建設一個可隨每日請求數增長而擴充且性能不會下降的爬蟲基礎設施。

在規模析取產品數據時,一個串行爬取的簡單web爬蟲是不堪此任的。通常一個串行的web爬蟲會循環發出請求,每一項請求都要2到3秒鐘完成。

如果你的爬蟲每天發出的請求數不到40000的話這種做法是沒有問題的。然而,超過這個點你就得過渡到一種讓你每天可以完成數百萬請求而不會性能下降的爬蟲架構。

這個話題得用一篇文章才能說得清楚,未來幾周我們將發布一篇專門的文章來討論如何設計和開發高吞吐量的爬取架構。然而,本節的剩餘部分我們將討論一些高級原則和最佳實踐。

正如我們討論過那樣,在規模爬取產品數據時速度是關鍵。你需要確保在時間閾值範圍內(通常是1天)可以找到並且爬取所有要求的產品頁面。為此你需要做以下一些事情:

將產品發現與產品析取分開

為了規模爬取產品數據你需要將你的產品發現爬蟲與產品析取爬蟲分開。

產品發現爬蟲的目標應該是讓它瀏覽目前產品目錄(或者「貨架」)然後存儲該目錄下的產品URL供產品析取爬蟲使用。

這個可以靠Scrapinghub 開發的開源工具Frontera之類的爬蟲前端輔助完成。儘管Frontera原先的目的是配合Scrapy使用的,但它其實完全是不可知論者,可用於任何爬蟲框架或者獨立項目。在這篇文章中,我們分享了如何利用Frontera來規模抓取HackerNews的東西。

分配更多資源給產品析取

由於每一個產品目錄「貨架」可包含10到100種產品,而且析取產品數據需要的資源要比析取產品URL更多,發現爬蟲通常運行要比產品析取爬蟲更快。這種情況下,你需要有多個析取爬蟲來對應每一個發現爬蟲。一條好的經驗法則是每10萬個頁面分配一個析取爬蟲。

挑戰 3:維護吞吐量性能

一級方程式的目標是將車上一切不必要的載荷都剔除掉,並且以速度之名將引擎最後一絲馬力都榨乾,從這個意義上來說規模抓取可以跟一級方程式相比較。規模web抓取也是一樣的道理。

在析取大量數據時,在現有硬體資源條件下,你總是會想方設法要尋找請求周期最小化爬蟲性能最大化的手段。這一切都是希望你能給每個請求節省下來那麼幾微秒的時間。

為此你的團隊需要對web爬取框架、代理管理以及所使用的硬體具備深刻理解,這樣才能對它們進行調整以優化性能。你還需要關注:

爬取效能

規模爬取時你應該始終把焦點放在以儘量少的請求析取所需數據上。任何額外請求或者數據析取都會放緩你爬取網站的節奏。在設計你的爬蟲時請記住這些提示:

作為最後一招,僅使用無界面瀏覽器,比如Splash或者Puppeteer來渲染JavaScript。用無界面瀏覽器渲染JavaScript同時爬取是非常耗資源的,會嚴重影響爬取的速度。如果你可以從貨架頁面(比如產品名稱、價格、評分等)獲得所需的數據而不需要向獨立的產品頁面提出請求的話,那就不要向產品頁面發出請求。不要請求或者析取圖像,除非迫不得已。

挑戰 4:反機器人的對策

如果你批量抓取電子商務網站的話一定會遇到採用反機器人對策的網站。

規模小一點的網站其反機器人對策就是些基本手段(屏蔽發送請求過量的IP)。然而,較大的電子商務網站,比如Amazon等,會採用複雜的反機器人對策,比如Distil Networks、Incapsula或者Akamai等來使得析取數據困難許多。

代理

了解到這一點之後,任何項目想要規模抓取才數據,首要的基本需求就是得用代理。規模抓取數據時你需要可觀的代理清單,而且需要實現必要的IP輪轉、請求限制、會話管理以及黑名單邏輯來預防代理被屏蔽。

或者除非你有或者願意用一支規模可觀的團隊管理你的代理,否則的話你應該把抓取流程中的這一部分外包出去。提供各種水平服務的代理服務有很多。

然而,我們的建議是找一家能夠提供單個代理配置端點並且將所有的代理管理複雜性隱藏起來的代理提供商。在沒有重新發明輪子、開發和維護自己的內部代理管理基礎設施的情況下規模抓取就已經很耗資源了。

大多數大型電子商務公司都採用這種做法。一些全球最大型的電子商務網站採用Scrapinghub 開發的智能下載器Crawlera,這個東西的代理管理完全是外包的。當你的爬蟲每天要發出2000萬條請求時,把注意力放在分析數據而不是管理代理上會有意義得多。

代理以外

不幸的是,光靠使用代理服務並不足以確保你能規避大型電子商務網站的反機器人對策。越來越多的網站正在利用複雜的反機器人對策來監控你的爬蟲行為,檢測其是否真人訪客。

這些範機器人對策不僅使得爬取電子商務網站越來越困難,而且克服這些手段如果做得不對的話也會嚴重拖累爬蟲性能。

這些機器人對策有很大一部分使用到了JavaScript來確定請求是否來自於爬蟲還是人(Javascript引擎檢查、字體枚舉、WebGL與Canvas等)。

不過正如前面所述,規模爬取時你希望限制可編寫腳本的無界面瀏覽器(Splash 或者Puppeteer等)的使用,因為渲染頁面的任何JavaScript都非常耗資源並且放慢爬取網站的速度。

這意味著為了確保你能取得必要的吞吐量讓爬蟲提交每天的產品數據,你往往需要痛苦地對目標網站採用的反機器人對策進行逆向工程,並且在不使用無界面瀏覽器的情況下設計你的爬蟲抵消那些對策。

挑戰 5:數據質量

從數據科學家的角度來說,任何網站爬取項目最重要的考慮是析取數據的質量。規模爬取只會令這一關注變得更加重要。

當每天都要析取數百萬數據點時,想靠人工來驗證數據是否乾淨和完整是不可能的。變髒或者不完整的數據很容易就會流入到你的數據流裡面,進而破壞了數據分析的效果。

尤其是在抓取同一個的不同版本(不同的語言、地區等)或者不同商店上的產品時更是如此。

在爬蟲開發的設計階段,需要進行仔細的QA流程,爬蟲代碼要經過同行評審和測試以確保用最可靠的方式析取到想要的數據。確保最高數據質量的最好的辦法是部署一套自動化QA監控系統。

作為任何數據析取項目的一部分,你需要計劃和開發一套監控系統,這套系統將提醒你任何不一致的數據以及發生的爬蟲錯誤。Scrapinghub開發了一個機器學習算法來檢測:

數據驗證錯誤——每一個數據項都有定義好的遵循一致模式的數據類型和值。我們的數據驗證算法會提醒項目的QA團隊任何與預期數據類型不一致的數據項,然後再進行人工檢查、提醒已驗證或者標記為錯誤。產品差異化錯誤——從同一網站的多個版本(不同語言、地區)爬取相同產品數據時,有可能變量或者像產品重量或者尺寸這樣本該是固定值的數據項也會不一樣。這可能是網站反機器人對策向你的一到多個爬蟲提供篡改信息的結果。再次地,你需要算法來識別和標記類似這樣的情況。基於數量的不一致性——另一個關鍵的監控腳本是檢測返回記錄的任何異常變化。這可能預示網站已經做出改變或者你的爬蟲被提供了篡改的信息。網站變化——目標網站發生的結構性改變是爬蟲失效的主要原因。我們的專用監控系統會監控到這一點。該工具會對目標網站進行頻繁的檢查,確保自從上次抓取之後沒有發生任何變化。如果改變被發現,它也會發出通知。

我們會在稍後的文章中專門討論自動質量保證的細節。

總結

正如你所看到那樣,規模抓取產品數據會面臨一系列的獨特挑戰。希望這篇文章能夠讓你更加意識到相關挑戰,並且就如何解決這些問題獲得啟發。

然而,這只是本系列文章的第一部分,所以如果你感興趣的話可以註冊我們的電子郵件列表,一旦下一篇文章發表了我們會第一時間通知你。

原文連結:https://blog.scrapinghub.com/web-scraping-at-scale-lessons-learned-scraping-100-billion-products-pages

編譯組出品。編輯:郝鵬程。

相關焦點

  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?網絡爬蟲,也叫作網絡數據採集,是指通過編程從Web伺服器請求數據(HTML表單),然後解析HTML以提取所需的數據。
  • 小課堂:如何用Excel抓取網頁數據
    怎麼識別一個網頁是不是table標籤呢?很簡單,選擇任意一個數據,然後在網頁中點擊右鍵,選擇「檢查」。這種網頁就不好直接導入了。比如我常看的「知乎」,他們的網頁裡一個table都沒有。本質上,網頁中的數據都會包打包成一個數據包,發送個網頁後,網頁再讀取數據包進行渲染。這個數據包常用的格式是JSON,那麼我們只要把JSON數據包抓取下來,也可以實現網頁數據抓取。
  • R語言爬蟲系列6|動態數據抓取範例
    詳情可見推文:R語言爬蟲利器:rvest包+SelectorGadget抓取鏈家杭州二手房數據 但網絡爬蟲這個江湖太險惡,單靠一招rvest行走江湖必然兇多吉少,一不小心碰到什麼AJAX和動態網頁憑僅掌握rvest的各位必定束手無策。本文小編就簡單介紹下在用R語言進行實際的網絡數據抓取時如何將動態數據給弄到手。
  • 使用 Scrapy 快速抓取網頁
    多線程根據連結逐層抓取解析數據校驗保存為多種數據格式或保存到資料庫其他Scrapy 與其它常用的庫如 Requests 或 BeautifulSoup 之間的區別非常明顯。它能以一種簡單的方式解決網頁抓取中常見的問題。
  • Python新手爬蟲,簡單製作抓取廖雪峰的教程的小爬蟲
    在整個抓取過程中,除了普通的文本以外,還需要處理 3個地方,分別是:代碼、圖片、視頻,因為目前只寫到了文本文件,所以直接抓到圖片或者視頻的地址,標識清楚後寫入到 txt,這裡可以在進一步,寫到 word/pdf 或者其他文件,留待以後改進!
  • 跟我學R爬蟲|AJAX與動態網頁簡介
    因為知乎首頁是一個動態網站(DHTML),具體表現就是從首頁不斷下拉,網頁內容在不斷變化但url卻一直都是https://www.zhihu.com/,或者是點擊了某個地方內容也發生了變化但抬頭一看地址欄,url依然沒有變化。對這樣的網頁進行抓取哪能按照以前的簡單套路來?明顯是不可行的。
  • Web Scraping(網頁抓取)基本原理 - 白話篇
    易混淆的名稱:很多時候,大家會把,在網上獲取Data的代碼,統稱為「爬蟲」,但實際上,所謂的「爬蟲」,並不是特別準確,因為「爬蟲」也是分種的,常見的「爬蟲」有兩種:網路爬蟲 (Web Crawler),又稱 Spider;Spiderbot網頁抓取 (Web Scraper),又稱 Web Harvesting;Web Data Extraction而,這篇文章,主要講解的是第二種「爬蟲」(Web Scraper)的原理。
  • 「爬蟲四步走」手把手教你使用Python抓取並存儲網頁數據!
    爬蟲是Python的一個重要的應用,使用Python爬蟲我們可以輕鬆的從網際網路中抓取我們想要的數據,本文將基於爬取B站視頻熱搜榜單數據並存儲為例,詳細介紹Python爬蟲的基本流程。如果你還在入門爬蟲階段或者不清楚爬蟲的具體工作流程,那麼應該仔細閱讀本文!
  • 簡易數據分析 04|Web Scraper 初嘗:抓取豆瓣高分電影
    這是簡易數據分析系列的第 4 篇文章今天我們開始數據抓取的第一課,完成我們的第一個爬蟲。因為是剛剛開始,操作我會講的非常詳細,可能會有些囉嗦,希望各位不要嫌棄啊:)有人之前可能學過一些爬蟲知識,總覺得這是個複雜的東西,什麼 HTTP、HTML、IP 池,在這裡我們都不考慮這些東西。
  • python為什麼叫爬蟲?為啥那麼多人通過python兼職都能掙不少錢?
    大家點開百度右擊網頁原始碼會發現是這些玩意:那其實這些許許多多的網站背後都是一些數據如果我們可以用一個自動化的程序輕輕鬆鬆就能把它們給爬取下來,是不是很爽?比如,一些文獻網站我們只要用 Python寫幾行代碼然後一運行這個程序就幫我們爬取所有的相關文獻到我們本地完全不需要我們費一點力氣。
  • Python爬蟲入門教程:超級簡單的Python爬蟲教程
    這是一篇詳細介紹 Python 爬蟲入門的教程,從實戰出發,適合初學者。讀者只需在閱讀過程緊跟文章思路,理清相應的實現代碼,30 分鐘即可學會編寫簡單的 Python 爬蟲。5 部分內容:了解網頁;使用 requests 庫抓取網站數據;使用 Beautiful Soup 解析網頁;清洗和組織數據;
  • 網絡爬蟲違法?扯!繼續學習我的第一個爬蟲
    網絡爬蟲領域目前還屬於早期的拓荒階段,雖然網際網路世界已經通過自身的協議建立起一定的道德規範(Robots協議),但法律部分還在建立和完善中。從目前的情況來看,如果抓取的數據屬於個人使用或科研範疇,基本不存在問題;而如果數據屬於商業盈利範疇,就要就事而論,有可能屬於違法行為,也有可能不違法。
  • 寫網絡爬蟲程序的難度是怎麼分等級的
    有時候,你輕而易舉地就抓取到了想要的數據;有時候,你費盡心思卻毫無所獲。 好多Python爬蟲的入門教程都是一行代碼就把你騙上了「賊船」,等上了賊船才發現,水好深~比如爬取一個網頁可以是很簡單的一行代碼: r = requests.get('http://news.baidu.com')
  • Python新手都可以做的爬蟲,抓取網上 OJ 題庫信息
    最近有朋友在做 OJ 題庫,順手做個小爬蟲,導出一份題庫列表來看看!目標:浙江大學題庫工具:python3.6,requests 庫、lxml 庫、pycharm思路:先找到網頁中題庫所在的位置然後我們點擊第一頁和後面幾頁,看看 url 的變化發現規律了嗎?
  • Python——爬蟲
    網絡爬蟲:網絡爬蟲是一種按照一定規則,自動抓取全球資訊網信息的程序或腳本。簡單的說,就是用實現寫好的程序去抓取網絡上所需的數據,這樣的程序就叫網絡爬蟲。2、聚焦爬蟲聚焦爬蟲是面向特定主題需求的一種網絡爬蟲程序。它與通用搜尋引擎爬蟲的區別在於:聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。
  • 一段爬蟲引起的風暴,大數據公司史上最大「危機」
    最近一段時間有關大數據的話題可謂是熱火朝天,要知道大數據作為一項切實改變著我們生活的技術,雖然給我們的生活帶來了不少便利,但也讓我們的隱私蕩然無存。不過最近的數據圈子並不太平,準確一點的說,是爬蟲圈不太平,甚至可以說是迎來了中國爬蟲圈的最大風暴。
  • Python網頁爬蟲入門指導
    雖然之前有過一些基礎,但是這次還是耗費了一些時間,因為網上,尤其是中文科技網站太多坑要踩,所以,我在這裡用最簡潔的方式寫下網頁爬蟲的入門方法,希望能夠幫助到對網頁爬蟲感興趣卻無從下手的同學。就如同標題指明的那樣,本文主要針對入門,如果尋求進階,或者在爬蟲方面走的更遠,本文提供的幫助也許是微乎其微的。
  • 國內五大主流網站內容抓取工具、採集軟體大盤點
    大數據技術用了多年時間進行演化,才從一種看起來很炫酷的新技術變成了企業在生產經營中實際部署的服務。其中,數據採集產品迎來了廣闊的市場前景,無論國內外,市面上都出現了許多技術不一、良莠不齊的採集軟體。3.集搜客一款簡單易用的網頁信息抓取軟體,能夠抓取網頁文字、圖表、超連結等多種網頁元素。同樣可通過簡單可視化流程進行採集,服務於任何對數據有採集需求的人群。
  • 零基礎不知道如何做Python爬蟲,這是一份簡單入門的教程!
    簡單來說,我們向伺服器發送請求後,會得到返回的頁面,通過解析頁面之後,我們可以抽取我們想要的那部分信息,並存儲在指定的文檔或資料庫中。在這部分你可以簡單了解 HTTP 協議及網頁基礎知識,比如 POSTGET、HTML、CSS、JS,簡單了解即可,不需要系統學習。
  • 玩大數據一定用得到的19款 Java 開源 Web 爬蟲
    Heritrix 是個「Archival Crawler」——來獲取完整的、精確的、站點內容的深度複製。包括獲取圖像以及其他非文本內容。抓取並存儲相關的內容。對內容來者不拒,不對頁面進行內容上的修改。重新爬行對相同的URL不針對先前的進行替換。爬蟲主要通過Web用戶界面啟動、監控和調整,允許彈性的定義要獲取的url。