從千億頁面上提取數(shù)據(jù)所總結(jié)的產(chǎn)品數(shù)據(jù)五大經(jīng)驗

如今從網(wǎng)上抓取數(shù)據(jù)看似非常容易。有許多開源庫和框架、可視化抓取工具和數(shù)據(jù)提取工具,可以很容易地從一個網(wǎng)站上抓取數(shù)據(jù)。但是,當(dāng)你想大規(guī)模地搜索網(wǎng)站時,很快就會感覺到非常棘手。

本文中,我們將與你分享自2010年以來借助Scrapinghub從一千億個產(chǎn)品頁面上抓取數(shù)據(jù)時所學(xué)到的經(jīng)驗教訓(xùn),讓你深入了解從電子商務(wù)店鋪大規(guī)模提取產(chǎn)品數(shù)據(jù)時面臨的挑戰(zhàn),并與你分享一些應(yīng)對這些挑戰(zhàn)的最佳實踐經(jīng)驗。

Scrapinghub成立于2010年,是數(shù)據(jù)提取公司中的佼佼者之一,也是Scrapy的締造者——Scrapy是當(dāng)今最強(qiáng)大、最受歡迎的網(wǎng)絡(luò)抓取框架。目前,Scrapinghub為全球眾多的大型電子商務(wù)公司每月抓取超過80億的頁面(其中30億是產(chǎn)品頁面)。

 

[title]大規(guī)模抓取網(wǎng)頁的要點[/title]

 

與標(biāo)準(zhǔn)的抓取網(wǎng)頁應(yīng)用程序不同,大規(guī)模抓取電子商務(wù)的產(chǎn)品數(shù)據(jù)將面臨一系列獨特的挑戰(zhàn),這使得網(wǎng)頁抓取異常艱難。

從本質(zhì)上來說,這些困難可以歸結(jié)為兩個方面:速度和數(shù)據(jù)質(zhì)量。

通常時間是一個限制性約束,因此大規(guī)模抓取需要網(wǎng)絡(luò)爬蟲以非常高的速度抓取頁面,并不會影響數(shù)據(jù)質(zhì)量。這種對速度的要求造成大量抓取產(chǎn)品數(shù)據(jù)富有非常大的挑戰(zhàn)性。

從千億頁面上提取數(shù)據(jù)所總結(jié)的產(chǎn)品數(shù)據(jù)五大經(jīng)驗

 

[title]挑戰(zhàn)1:雜亂且變幻無常的網(wǎng)頁格式[/title]

 

雜亂且變化無常的網(wǎng)頁格式可能是最常見的挑戰(zhàn),也可能不是最令人感興趣的挑戰(zhàn),但它是迄今為止大規(guī)模提取數(shù)據(jù)時面臨的最大挑戰(zhàn)。這項挑戰(zhàn)的關(guān)鍵不在于復(fù)雜性,而是需要花費大量時間和資源去處理。

如果你有過創(chuàng)建電子商務(wù)店鋪爬蟲經(jīng)歷的話,你就會知道電子商務(wù)店鋪代碼的雜亂無章是普遍現(xiàn)象。這不僅僅是HTML的格式或偶爾的字符編碼問題。多年來,我們遇到了各種各樣的問題,例如濫用HTTP響應(yīng)代碼、不完整的JavaScripts,或濫用Ajax:

  • 在產(chǎn)品銷售終止后,店鋪會刪除頁面,且在網(wǎng)站升級后404錯誤處理程序突然返回的響應(yīng)狀態(tài)為200;
  • 有些頁面錯誤地轉(zhuǎn)義JSON數(shù)據(jù),導(dǎo)致頁面上的Javascript遭到破壞,例如‘b0rk’d’等,所以必須使用正則表達(dá)式來刪除這些數(shù)據(jù);
  • 店鋪大量濫用Ajax調(diào)用,所以只能等頁面渲染完畢(這會導(dǎo)致爬蟲速度更慢)或模仿API調(diào)用(這會導(dǎo)致額外的開發(fā)工作)才能想要的拿到信息。

如此雜亂的代碼會讓編寫爬蟲工作十分痛苦,且無法使用抓取工具或自動提取工具。

在大規(guī)模抓取網(wǎng)頁時,你不僅需要瀏覽幾百個像這樣雜亂的網(wǎng)站,還要處理網(wǎng)站的不斷更新。一個經(jīng)驗法則是:每2-3個月目標(biāo)網(wǎng)站的變動就會廢掉你的爬蟲。

可能聽起來不是什么大不了的事兒,但是當(dāng)你大規(guī)模抓取時,這些意外會積累成災(zāi)。例如,Scrapinghub的一個大型電子商務(wù)項目大約有4000個爬蟲,需要抓取1000個電子商務(wù)網(wǎng)站,這意味著每天他們都有20-30只爬蟲遭遇失敗。

來自區(qū)域和多語言網(wǎng)站布局的變動,A/B分割測試和包裝/定價變動也會經(jīng)常給爬蟲帶來問題。

 

沒有捷徑

很不幸的是,沒有完全解決這些問題的靈丹妙藥。很多時候,我們只能隨著規(guī)模擴(kuò)展投入更多資源。以上述項目為例,負(fù)責(zé)項目的團(tuán)隊共有18名爬蟲工程師和3名專職QA,以確??蛻羰冀K擁有可靠的數(shù)據(jù)。

但是,憑借經(jīng)驗團(tuán)隊可以學(xué)會如何創(chuàng)建更強(qiáng)大的爬蟲,以便檢測和對付網(wǎng)站格式的各種怪招。

最佳做法不是為目標(biāo)網(wǎng)站可能使用的所有布局逐一編寫爬蟲,而是僅憑一個產(chǎn)品提取的爬蟲就可以處理不同頁面布局所使用的所有可能規(guī)則和方案。爬蟲擁有的配置越多越好。

雖然這些做法會讓爬蟲更加復(fù)雜(我們的一些爬蟲長達(dá)幾千行),但可以保證爬蟲更加易于維護(hù)。

由于大多數(shù)公司需要每天都抽取產(chǎn)品數(shù)據(jù),所以我們無法花費幾天時間等待工程團(tuán)隊修改遭到破壞的爬蟲。對于這種情況,Scrapinghub使用一種基于數(shù)據(jù)提取工具的機(jī)器學(xué)習(xí),我們開發(fā)了這種機(jī)器學(xué)習(xí)模型作為后備,直到爬蟲被修復(fù)。這種基于機(jī)器學(xué)習(xí)的提取工具可以自動識別目標(biāo)網(wǎng)站的目標(biāo)字段(產(chǎn)品名稱、價格、貨幣、圖像、SKU等等),并返回所需的結(jié)果。

 

[title]挑戰(zhàn)2:可擴(kuò)展性架構(gòu)[/title]

 

你將面臨的下一個挑戰(zhàn)是:構(gòu)建一個爬蟲基礎(chǔ)架構(gòu),該架構(gòu)可以隨著每天請求數(shù)量的增加而擴(kuò)展,而不會降低性能。

當(dāng)大規(guī)模提取產(chǎn)品數(shù)據(jù)時,簡單的網(wǎng)頁爬蟲只能連續(xù)地抓取數(shù)據(jù),而不會節(jié)選。通常,一個連續(xù)的網(wǎng)頁抓取會循環(huán)發(fā)送請求,一個接一個,每個請求需要2-3秒才能完成。

如果爬蟲每天都請求量小于4萬個的話(每2秒發(fā)送一個請求,意味著每天可以發(fā)送43,200個請求),這個方法還可以。但是,一旦請求數(shù)量超過這個數(shù),你就需要切換到每天可以發(fā)送幾百萬請求且不會降低性能的爬蟲架構(gòu)。

正如上述討論,速度是大規(guī)模抓取產(chǎn)品數(shù)據(jù)的關(guān)鍵。你需要確保在一定時間內(nèi)(通常為一天)找到并抓取所有所需的產(chǎn)品頁面。為此,你需要執(zhí)行以下操作:

 

從產(chǎn)品提取中分離產(chǎn)品搜索

為了大規(guī)模提取產(chǎn)品數(shù)據(jù),你需要從產(chǎn)品提取爬蟲中分離產(chǎn)品搜索爬蟲。

產(chǎn)品搜索爬蟲的目標(biāo)應(yīng)該是找到目標(biāo)產(chǎn)品種類(或“貨架”),并保存該種類下產(chǎn)品的URL,以供產(chǎn)品提取爬蟲使用。當(dāng)產(chǎn)品搜索爬蟲將產(chǎn)品URL加到隊列后,產(chǎn)品提取爬蟲會從茶品頁面上抓取目標(biāo)數(shù)據(jù)。

這項工作可以借助流行的爬蟲工具的輔助,例如由Scrapinghub開發(fā)的開源爬蟲工具Frontera等。雖然最初設(shè)計Frontera是為了用于Scrapy,但它完全沒有限制,可以與任何其他爬蟲框架或獨立項目一起使用。在本文中,我們將分享如何使用Frontera大量挖掘HackerNews的數(shù)據(jù)。

 

為產(chǎn)品提取分配更多資源

由于每個產(chǎn)品類別“貨架”可以包含10到100個產(chǎn)品,且與提取產(chǎn)品URL相比,提取產(chǎn)品數(shù)據(jù)需要更多資源,因此搜索爬蟲的速度通常比產(chǎn)品抽取爬蟲更快。對于這種情況,你需要為每個搜索爬蟲配備多個抽取爬蟲。經(jīng)驗法則是:每100,000頁需要創(chuàng)建一直單獨的抽取爬蟲。

 

[title]挑戰(zhàn)3:維持吞吐量性能[/title]

 

大規(guī)模抓取很像賽車Formula 1,我們的目標(biāo)是為了提高速度,盡可能地減輕車身重量,并從發(fā)動機(jī)中擠出最后一部分馬力。對于大規(guī)模網(wǎng)絡(luò)抓取也是如此。

在提取大量數(shù)據(jù)時,我們必須盡可能尋找可以將周期時間降到最小、并在現(xiàn)有硬件資源的基礎(chǔ)上將爬蟲性能提高到最大的方法。所有這些都必須減少每個請求的時間,哪怕是幾毫秒。

為此,你的團(tuán)隊需要深入了解正在使用的網(wǎng)頁抓取框架、代理管理和硬件,才能更好地調(diào)優(yōu),以獲取最佳性能。你還需要關(guān)注:

 

爬蟲效率

大規(guī)模抓取的時候,我們始終應(yīng)該努力在盡可能少的請求次數(shù)內(nèi)提取所需的確切數(shù)據(jù)。任何額外的請求或數(shù)據(jù)提取都會降低抓取網(wǎng)站的速度。在設(shè)計爬蟲時,請記住以下幾點:

  • 只是用沒有頭部的瀏覽器,如Splash或Puppeteer等,將JavaScript渲染放到最后。抓取網(wǎng)頁時,使用沒有頭部的瀏覽器渲染JavaScript會非常耗費資源,并且會嚴(yán)重影響到抓取速度;
  • 如果無需向每個產(chǎn)品頁面發(fā)送請求,也可以從貨架頁面(例如產(chǎn)品名稱、價錢、口碑等)獲取數(shù)據(jù),則不要請求產(chǎn)品頁面;
  • 除非有必要,否則不要請求或提取圖像。

 

[title]挑戰(zhàn)4:反機(jī)器人策略[/title]

 

在大規(guī)模抓取電子商務(wù)網(wǎng)站的時候,肯定會遇到使用反機(jī)器人策略的網(wǎng)站。

對于大多數(shù)小型網(wǎng)站來說,他們的反機(jī)器人策略非常基本(禁止IP提出超額請求)。然而,對于亞馬遜等大型電子商務(wù)網(wǎng)站說,他們會使用非常成熟的反機(jī)器人策略,例如Distil Networks、Incapsula或Akamai等,這會讓提取數(shù)據(jù)變得更加困難。

 

代理

請記住,對于大規(guī)模抓取產(chǎn)品數(shù)據(jù)的項目來說,最重要的要求是使用代理IP。在大規(guī)模抓取時,你需要一個相當(dāng)大的代理列表,并且需要實現(xiàn)必要的IP輪換、請求限制、會話管理和黑名單邏輯,以防止代理被封殺。

除非你有一個龐大的隊伍管理代理,否則你應(yīng)該將這部分抓取工作外包出去。外面有大量代理服務(wù)可以提供各種級別的服務(wù)。

但是,我們建議你可以與代理商合作,讓他們?yōu)榇砼渲锰峁﹩蝹€端點并隱藏管理代理的復(fù)雜性。大規(guī)模抓取非常耗資源,更不用想需要通過開發(fā)和維護(hù)建立自己內(nèi)部的代理管理基礎(chǔ)設(shè)施了。

大多數(shù)大型電子商務(wù)公司都采用這種方法。許多世界上最大的電子商務(wù)公司都是用Scrapinghub開發(fā)的智能下載器Crawlera,將代理管理全權(quán)外包。如果你的抓取工具每天需要發(fā)出兩千萬個請求的話,相較于代理管理,專注于抓住會更有意義。

 

超越代理

不幸的是,僅使用代理服務(wù)還不足以確??梢砸?guī)避大型電子商務(wù)網(wǎng)站的反機(jī)器人策略。越來越多的網(wǎng)站開始使用成熟的反機(jī)器人策略,來監(jiān)控爬蟲行為,檢測請求是否來自人類訪問者。

這些反機(jī)器人策略不僅會給電子商務(wù)網(wǎng)站的抓取制造困難,而且如果處理不當(dāng),與它們的斗爭還會嚴(yán)重影響爬蟲的性能。

這些反機(jī)器人策略大多數(shù)都是用JavaScript來確定請求來自于爬蟲還是人(JavaScript引擎檢查、字體枚舉、WebGL和Canvas等)。

但是如前所述,大規(guī)模抓取數(shù)據(jù)時,我們希望使用可編寫腳本的沒有頭部的瀏覽器(如Splash或Puppeteer等),頁面上的JavaScript渲染會給資源造成壓力,并降低抓取網(wǎng)站的速度。

這意味著為了確保你的爬蟲可以達(dá)到必要的吞吐量,從而提供每日的產(chǎn)品數(shù)據(jù),通常你需要費盡心思對抗反網(wǎng)站上使用的機(jī)器人策略,并設(shè)計爬蟲在不使用沒有頭部的瀏覽器的情況下也可以戰(zhàn)勝它們。

 

[title]挑戰(zhàn)5:數(shù)據(jù)質(zhì)量[/title]

 

從數(shù)據(jù)科學(xué)家的角度來看,網(wǎng)頁抓取項目最重要的考慮因素是提取的數(shù)據(jù)質(zhì)量。大規(guī)模抓取更加關(guān)注數(shù)據(jù)的質(zhì)量。

如果每天需要提取幾百萬個數(shù)據(jù)點,那么手工驗證所有數(shù)據(jù)是否干凈完整是不可能的。一個不小心臟數(shù)據(jù)或不完整的數(shù)據(jù)就會進(jìn)入數(shù)據(jù)源,并破壞數(shù)據(jù)分析工作。

當(dāng)?shù)赇佊卸鄠€版本(不同語言、地區(qū)等)或從不同店鋪抓取數(shù)據(jù)時,數(shù)據(jù)質(zhì)量尤為重要。

除了仔細(xì)的QA流程外,創(chuàng)建爬蟲的設(shè)計階段,通過互相審查和測試爬蟲的代碼可以確保以最可靠的方式提取所需的數(shù)據(jù)。確保數(shù)據(jù)高質(zhì)量的最佳方法是開發(fā)自動化QA監(jiān)視系統(tǒng)。

作為數(shù)據(jù)提取項目的一部分,你需要計劃和開發(fā)一個監(jiān)控系統(tǒng),來提醒你數(shù)據(jù)上出現(xiàn)的不一致和爬蟲錯誤。在Scrapinghub,我們開發(fā)了機(jī)器學(xué)習(xí)算法用于檢測:

  • 數(shù)據(jù)驗證錯誤:每條數(shù)據(jù)都有定義好的數(shù)據(jù)類型和需要遵循的賦值模式。如果數(shù)據(jù)項的數(shù)據(jù)類型不一致,我們的數(shù)據(jù)驗證算法會通知QA團(tuán)隊,由他們負(fù)責(zé)手動檢查數(shù)據(jù),經(jīng)過驗證后返還或標(biāo)記成錯誤。
  • 產(chǎn)品差異錯誤:當(dāng)從同一個網(wǎng)站的不同版本(不同語言、地區(qū)等)抓取同一個產(chǎn)品數(shù)據(jù)時,可能會有所不同,且理應(yīng)固定的值(例如產(chǎn)品重量、尺寸等)也有可能變化。這有可能是網(wǎng)站的反機(jī)器人策略給出了一個或多個虛假信息。同樣,你需要合適的算法來識別和標(biāo)記此類數(shù)據(jù)。
  • 卷上數(shù)據(jù)的不一致:另一個關(guān)鍵的監(jiān)控腳本是檢測返回的記錄數(shù)量的異常變化。這可能表示網(wǎng)站已經(jīng)做了修改,或者你的爬蟲拿到的是虛假信息。
  • 網(wǎng)站更新:目標(biāo)網(wǎng)站的結(jié)構(gòu)變化是造成爬蟲崩潰的主要原因。我們有專門的監(jiān)控系統(tǒng),非常積極地監(jiān)控這種情況。該工具會頻繁地檢查目標(biāo)站點,確保自上次抓取以來沒有任何變化。一旦發(fā)現(xiàn)變化,它會發(fā)出通知。

 

[title]總結(jié)[/title]

 

如你所見,大規(guī)模抓取產(chǎn)品數(shù)據(jù)需要面臨一系列獨特的挑戰(zhàn)。希望這篇文章可以讓你更加了解這些挑戰(zhàn)以及如何解決這些挑戰(zhàn)。

在Scrapinghub,我們專注于將非結(jié)構(gòu)化Web數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)。如果你對本文有任何想法,請在下面留言。

 

文:Ian Kerins ?譯:彎月/CSDN(CSDNnews)

增長黑客CGO薦讀產(chǎn)品運營:

更多精彩,關(guān)注:增長黑客(GrowthHK.cn)

增長黑客(Growth Hacker)是依靠技術(shù)和數(shù)據(jù)來達(dá)成各種營銷目標(biāo)的新型團(tuán)隊角色。從單線思維者時常忽略的角度和高度,梳理整合產(chǎn)品發(fā)展的因素,實現(xiàn)低成本甚至零成本帶來的有效增長…

本文經(jīng)授權(quán)發(fā)布,不代表增長黑客立場,如若轉(zhuǎn)載,請注明出處:http://m.gptmaths.com/cgo/product/13757.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
上一篇 2018-08-19 20:30
下一篇 2018-08-20 10:10

增長黑客Growthhk.cn薦讀更多>>

發(fā)表回復(fù)

登錄后才能評論