如今從網(wǎng)上抓取數(shù)據(jù)看似非常容易。有許多開(kāi)源庫(kù)和框架、可視化抓取工具和數(shù)據(jù)提取工具,可以很容易地從一個(gè)網(wǎng)站上抓取數(shù)據(jù)。但是,當(dāng)你想大規(guī)模地搜索網(wǎng)站時(shí),很快就會(huì)感覺(jué)到非常棘手。
本文中,我們將與你分享自2010年以來(lái)借助Scrapinghub從一千億個(gè)產(chǎn)品頁(yè)面上抓取數(shù)據(jù)時(shí)所學(xué)到的經(jīng)驗(yàn)教訓(xùn),讓你深入了解從電子商務(wù)店鋪大規(guī)模提取產(chǎn)品數(shù)據(jù)時(shí)面臨的挑戰(zhàn),并與你分享一些應(yīng)對(duì)這些挑戰(zhàn)的最佳實(shí)踐經(jīng)驗(yàn)。
Scrapinghub成立于2010年,是數(shù)據(jù)提取公司中的佼佼者之一,也是Scrapy的締造者——Scrapy是當(dāng)今最強(qiáng)大、最受歡迎的網(wǎng)絡(luò)抓取框架。目前,Scrapinghub為全球眾多的大型電子商務(wù)公司每月抓取超過(guò)80億的頁(yè)面(其中30億是產(chǎn)品頁(yè)面)。
[title]大規(guī)模抓取網(wǎng)頁(yè)的要點(diǎn)[/title]
與標(biāo)準(zhǔn)的抓取網(wǎng)頁(yè)應(yīng)用程序不同,大規(guī)模抓取電子商務(wù)的產(chǎn)品數(shù)據(jù)將面臨一系列獨(dú)特的挑戰(zhàn),這使得網(wǎng)頁(yè)抓取異常艱難。
從本質(zhì)上來(lái)說(shuō),這些困難可以歸結(jié)為兩個(gè)方面:速度和數(shù)據(jù)質(zhì)量。
通常時(shí)間是一個(gè)限制性約束,因此大規(guī)模抓取需要網(wǎng)絡(luò)爬蟲(chóng)以非常高的速度抓取頁(yè)面,并不會(huì)影響數(shù)據(jù)質(zhì)量。這種對(duì)速度的要求造成大量抓取產(chǎn)品數(shù)據(jù)富有非常大的挑戰(zhàn)性。
[title]挑戰(zhàn)1:雜亂且變幻無(wú)常的網(wǎng)頁(yè)格式[/title]
雜亂且變化無(wú)常的網(wǎng)頁(yè)格式可能是最常見(jiàn)的挑戰(zhàn),也可能不是最令人感興趣的挑戰(zhàn),但它是迄今為止大規(guī)模提取數(shù)據(jù)時(shí)面臨的最大挑戰(zhàn)。這項(xiàng)挑戰(zhàn)的關(guān)鍵不在于復(fù)雜性,而是需要花費(fèi)大量時(shí)間和資源去處理。
如果你有過(guò)創(chuàng)建電子商務(wù)店鋪爬蟲(chóng)經(jīng)歷的話,你就會(huì)知道電子商務(wù)店鋪代碼的雜亂無(wú)章是普遍現(xiàn)象。這不僅僅是HTML的格式或偶爾的字符編碼問(wèn)題。多年來(lái),我們遇到了各種各樣的問(wèn)題,例如濫用HTTP響應(yīng)代碼、不完整的JavaScripts,或?yàn)E用Ajax:
- 在產(chǎn)品銷售終止后,店鋪會(huì)刪除頁(yè)面,且在網(wǎng)站升級(jí)后404錯(cuò)誤處理程序突然返回的響應(yīng)狀態(tài)為200;
- 有些頁(yè)面錯(cuò)誤地轉(zhuǎn)義JSON數(shù)據(jù),導(dǎo)致頁(yè)面上的Javascript遭到破壞,例如‘b0rk’d’等,所以必須使用正則表達(dá)式來(lái)刪除這些數(shù)據(jù);
- 店鋪大量濫用Ajax調(diào)用,所以只能等頁(yè)面渲染完畢(這會(huì)導(dǎo)致爬蟲(chóng)速度更慢)或模仿API調(diào)用(這會(huì)導(dǎo)致額外的開(kāi)發(fā)工作)才能想要的拿到信息。
如此雜亂的代碼會(huì)讓編寫(xiě)爬蟲(chóng)工作十分痛苦,且無(wú)法使用抓取工具或自動(dòng)提取工具。
在大規(guī)模抓取網(wǎng)頁(yè)時(shí),你不僅需要瀏覽幾百個(gè)像這樣雜亂的網(wǎng)站,還要處理網(wǎng)站的不斷更新。一個(gè)經(jīng)驗(yàn)法則是:每2-3個(gè)月目標(biāo)網(wǎng)站的變動(dòng)就會(huì)廢掉你的爬蟲(chóng)。
可能聽(tīng)起來(lái)不是什么大不了的事兒,但是當(dāng)你大規(guī)模抓取時(shí),這些意外會(huì)積累成災(zāi)。例如,Scrapinghub的一個(gè)大型電子商務(wù)項(xiàng)目大約有4000個(gè)爬蟲(chóng),需要抓取1000個(gè)電子商務(wù)網(wǎng)站,這意味著每天他們都有20-30只爬蟲(chóng)遭遇失敗。
來(lái)自區(qū)域和多語(yǔ)言網(wǎng)站布局的變動(dòng),A/B分割測(cè)試和包裝/定價(jià)變動(dòng)也會(huì)經(jīng)常給爬蟲(chóng)帶來(lái)問(wèn)題。
沒(méi)有捷徑
很不幸的是,沒(méi)有完全解決這些問(wèn)題的靈丹妙藥。很多時(shí)候,我們只能隨著規(guī)模擴(kuò)展投入更多資源。以上述項(xiàng)目為例,負(fù)責(zé)項(xiàng)目的團(tuán)隊(duì)共有18名爬蟲(chóng)工程師和3名專職QA,以確保客戶始終擁有可靠的數(shù)據(jù)。
但是,憑借經(jīng)驗(yàn)團(tuán)隊(duì)可以學(xué)會(huì)如何創(chuàng)建更強(qiáng)大的爬蟲(chóng),以便檢測(cè)和對(duì)付網(wǎng)站格式的各種怪招。
最佳做法不是為目標(biāo)網(wǎng)站可能使用的所有布局逐一編寫(xiě)爬蟲(chóng),而是僅憑一個(gè)產(chǎn)品提取的爬蟲(chóng)就可以處理不同頁(yè)面布局所使用的所有可能規(guī)則和方案。爬蟲(chóng)擁有的配置越多越好。
雖然這些做法會(huì)讓爬蟲(chóng)更加復(fù)雜(我們的一些爬蟲(chóng)長(zhǎng)達(dá)幾千行),但可以保證爬蟲(chóng)更加易于維護(hù)。
由于大多數(shù)公司需要每天都抽取產(chǎn)品數(shù)據(jù),所以我們無(wú)法花費(fèi)幾天時(shí)間等待工程團(tuán)隊(duì)修改遭到破壞的爬蟲(chóng)。對(duì)于這種情況,Scrapinghub使用一種基于數(shù)據(jù)提取工具的機(jī)器學(xué)習(xí),我們開(kāi)發(fā)了這種機(jī)器學(xué)習(xí)模型作為后備,直到爬蟲(chóng)被修復(fù)。這種基于機(jī)器學(xué)習(xí)的提取工具可以自動(dòng)識(shí)別目標(biāo)網(wǎng)站的目標(biāo)字段(產(chǎn)品名稱、價(jià)格、貨幣、圖像、SKU等等),并返回所需的結(jié)果。
[title]挑戰(zhàn)2:可擴(kuò)展性架構(gòu)[/title]
你將面臨的下一個(gè)挑戰(zhàn)是:構(gòu)建一個(gè)爬蟲(chóng)基礎(chǔ)架構(gòu),該架構(gòu)可以隨著每天請(qǐng)求數(shù)量的增加而擴(kuò)展,而不會(huì)降低性能。
當(dāng)大規(guī)模提取產(chǎn)品數(shù)據(jù)時(shí),簡(jiǎn)單的網(wǎng)頁(yè)爬蟲(chóng)只能連續(xù)地抓取數(shù)據(jù),而不會(huì)節(jié)選。通常,一個(gè)連續(xù)的網(wǎng)頁(yè)抓取會(huì)循環(huán)發(fā)送請(qǐng)求,一個(gè)接一個(gè),每個(gè)請(qǐng)求需要2-3秒才能完成。
如果爬蟲(chóng)每天都請(qǐng)求量小于4萬(wàn)個(gè)的話(每2秒發(fā)送一個(gè)請(qǐng)求,意味著每天可以發(fā)送43,200個(gè)請(qǐng)求),這個(gè)方法還可以。但是,一旦請(qǐng)求數(shù)量超過(guò)這個(gè)數(shù),你就需要切換到每天可以發(fā)送幾百萬(wàn)請(qǐng)求且不會(huì)降低性能的爬蟲(chóng)架構(gòu)。
正如上述討論,速度是大規(guī)模抓取產(chǎn)品數(shù)據(jù)的關(guān)鍵。你需要確保在一定時(shí)間內(nèi)(通常為一天)找到并抓取所有所需的產(chǎn)品頁(yè)面。為此,你需要執(zhí)行以下操作:
從產(chǎn)品提取中分離產(chǎn)品搜索
為了大規(guī)模提取產(chǎn)品數(shù)據(jù),你需要從產(chǎn)品提取爬蟲(chóng)中分離產(chǎn)品搜索爬蟲(chóng)。
產(chǎn)品搜索爬蟲(chóng)的目標(biāo)應(yīng)該是找到目標(biāo)產(chǎn)品種類(或“貨架”),并保存該種類下產(chǎn)品的URL,以供產(chǎn)品提取爬蟲(chóng)使用。當(dāng)產(chǎn)品搜索爬蟲(chóng)將產(chǎn)品URL加到隊(duì)列后,產(chǎn)品提取爬蟲(chóng)會(huì)從茶品頁(yè)面上抓取目標(biāo)數(shù)據(jù)。
這項(xiàng)工作可以借助流行的爬蟲(chóng)工具的輔助,例如由Scrapinghub開(kāi)發(fā)的開(kāi)源爬蟲(chóng)工具Frontera等。雖然最初設(shè)計(jì)Frontera是為了用于Scrapy,但它完全沒(méi)有限制,可以與任何其他爬蟲(chóng)框架或獨(dú)立項(xiàng)目一起使用。在本文中,我們將分享如何使用Frontera大量挖掘HackerNews的數(shù)據(jù)。
為產(chǎn)品提取分配更多資源
由于每個(gè)產(chǎn)品類別“貨架”可以包含10到100個(gè)產(chǎn)品,且與提取產(chǎn)品URL相比,提取產(chǎn)品數(shù)據(jù)需要更多資源,因此搜索爬蟲(chóng)的速度通常比產(chǎn)品抽取爬蟲(chóng)更快。對(duì)于這種情況,你需要為每個(gè)搜索爬蟲(chóng)配備多個(gè)抽取爬蟲(chóng)。經(jīng)驗(yàn)法則是:每100,000頁(yè)需要?jiǎng)?chuàng)建一直單獨(dú)的抽取爬蟲(chóng)。
[title]挑戰(zhàn)3:維持吞吐量性能[/title]
大規(guī)模抓取很像賽車Formula 1,我們的目標(biāo)是為了提高速度,盡可能地減輕車身重量,并從發(fā)動(dòng)機(jī)中擠出最后一部分馬力。對(duì)于大規(guī)模網(wǎng)絡(luò)抓取也是如此。
在提取大量數(shù)據(jù)時(shí),我們必須盡可能尋找可以將周期時(shí)間降到最小、并在現(xiàn)有硬件資源的基礎(chǔ)上將爬蟲(chóng)性能提高到最大的方法。所有這些都必須減少每個(gè)請(qǐng)求的時(shí)間,哪怕是幾毫秒。
為此,你的團(tuán)隊(duì)需要深入了解正在使用的網(wǎng)頁(yè)抓取框架、代理管理和硬件,才能更好地調(diào)優(yōu),以獲取最佳性能。你還需要關(guān)注:
爬蟲(chóng)效率
大規(guī)模抓取的時(shí)候,我們始終應(yīng)該努力在盡可能少的請(qǐng)求次數(shù)內(nèi)提取所需的確切數(shù)據(jù)。任何額外的請(qǐng)求或數(shù)據(jù)提取都會(huì)降低抓取網(wǎng)站的速度。在設(shè)計(jì)爬蟲(chóng)時(shí),請(qǐng)記住以下幾點(diǎn):
- 只是用沒(méi)有頭部的瀏覽器,如Splash或Puppeteer等,將JavaScript渲染放到最后。抓取網(wǎng)頁(yè)時(shí),使用沒(méi)有頭部的瀏覽器渲染JavaScript會(huì)非常耗費(fèi)資源,并且會(huì)嚴(yán)重影響到抓取速度;
- 如果無(wú)需向每個(gè)產(chǎn)品頁(yè)面發(fā)送請(qǐng)求,也可以從貨架頁(yè)面(例如產(chǎn)品名稱、價(jià)錢(qián)、口碑等)獲取數(shù)據(jù),則不要請(qǐng)求產(chǎn)品頁(yè)面;
- 除非有必要,否則不要請(qǐng)求或提取圖像。
[title]挑戰(zhàn)4:反機(jī)器人策略[/title]
在大規(guī)模抓取電子商務(wù)網(wǎng)站的時(shí)候,肯定會(huì)遇到使用反機(jī)器人策略的網(wǎng)站。
對(duì)于大多數(shù)小型網(wǎng)站來(lái)說(shuō),他們的反機(jī)器人策略非常基本(禁止IP提出超額請(qǐng)求)。然而,對(duì)于亞馬遜等大型電子商務(wù)網(wǎng)站說(shuō),他們會(huì)使用非常成熟的反機(jī)器人策略,例如Distil Networks、Incapsula或Akamai等,這會(huì)讓提取數(shù)據(jù)變得更加困難。
代理
請(qǐng)記住,對(duì)于大規(guī)模抓取產(chǎn)品數(shù)據(jù)的項(xiàng)目來(lái)說(shuō),最重要的要求是使用代理IP。在大規(guī)模抓取時(shí),你需要一個(gè)相當(dāng)大的代理列表,并且需要實(shí)現(xiàn)必要的IP輪換、請(qǐng)求限制、會(huì)話管理和黑名單邏輯,以防止代理被封殺。
除非你有一個(gè)龐大的隊(duì)伍管理代理,否則你應(yīng)該將這部分抓取工作外包出去。外面有大量代理服務(wù)可以提供各種級(jí)別的服務(wù)。
但是,我們建議你可以與代理商合作,讓他們?yōu)榇砼渲锰峁﹩蝹€(gè)端點(diǎn)并隱藏管理代理的復(fù)雜性。大規(guī)模抓取非常耗資源,更不用想需要通過(guò)開(kāi)發(fā)和維護(hù)建立自己內(nèi)部的代理管理基礎(chǔ)設(shè)施了。
大多數(shù)大型電子商務(wù)公司都采用這種方法。許多世界上最大的電子商務(wù)公司都是用Scrapinghub開(kāi)發(fā)的智能下載器Crawlera,將代理管理全權(quán)外包。如果你的抓取工具每天需要發(fā)出兩千萬(wàn)個(gè)請(qǐng)求的話,相較于代理管理,專注于抓住會(huì)更有意義。
超越代理
不幸的是,僅使用代理服務(wù)還不足以確保可以規(guī)避大型電子商務(wù)網(wǎng)站的反機(jī)器人策略。越來(lái)越多的網(wǎng)站開(kāi)始使用成熟的反機(jī)器人策略,來(lái)監(jiān)控爬蟲(chóng)行為,檢測(cè)請(qǐng)求是否來(lái)自人類訪問(wèn)者。
這些反機(jī)器人策略不僅會(huì)給電子商務(wù)網(wǎng)站的抓取制造困難,而且如果處理不當(dāng),與它們的斗爭(zhēng)還會(huì)嚴(yán)重影響爬蟲(chóng)的性能。
這些反機(jī)器人策略大多數(shù)都是用JavaScript來(lái)確定請(qǐng)求來(lái)自于爬蟲(chóng)還是人(JavaScript引擎檢查、字體枚舉、WebGL和Canvas等)。
但是如前所述,大規(guī)模抓取數(shù)據(jù)時(shí),我們希望使用可編寫(xiě)腳本的沒(méi)有頭部的瀏覽器(如Splash或Puppeteer等),頁(yè)面上的JavaScript渲染會(huì)給資源造成壓力,并降低抓取網(wǎng)站的速度。
這意味著為了確保你的爬蟲(chóng)可以達(dá)到必要的吞吐量,從而提供每日的產(chǎn)品數(shù)據(jù),通常你需要費(fèi)盡心思對(duì)抗反網(wǎng)站上使用的機(jī)器人策略,并設(shè)計(jì)爬蟲(chóng)在不使用沒(méi)有頭部的瀏覽器的情況下也可以戰(zhàn)勝它們。
[title]挑戰(zhàn)5:數(shù)據(jù)質(zhì)量[/title]
從數(shù)據(jù)科學(xué)家的角度來(lái)看,網(wǎng)頁(yè)抓取項(xiàng)目最重要的考慮因素是提取的數(shù)據(jù)質(zhì)量。大規(guī)模抓取更加關(guān)注數(shù)據(jù)的質(zhì)量。
如果每天需要提取幾百萬(wàn)個(gè)數(shù)據(jù)點(diǎn),那么手工驗(yàn)證所有數(shù)據(jù)是否干凈完整是不可能的。一個(gè)不小心臟數(shù)據(jù)或不完整的數(shù)據(jù)就會(huì)進(jìn)入數(shù)據(jù)源,并破壞數(shù)據(jù)分析工作。
當(dāng)?shù)赇佊卸鄠€(gè)版本(不同語(yǔ)言、地區(qū)等)或從不同店鋪?zhàn)ト?shù)據(jù)時(shí),數(shù)據(jù)質(zhì)量尤為重要。
除了仔細(xì)的QA流程外,創(chuàng)建爬蟲(chóng)的設(shè)計(jì)階段,通過(guò)互相審查和測(cè)試爬蟲(chóng)的代碼可以確保以最可靠的方式提取所需的數(shù)據(jù)。確保數(shù)據(jù)高質(zhì)量的最佳方法是開(kāi)發(fā)自動(dòng)化QA監(jiān)視系統(tǒng)。
作為數(shù)據(jù)提取項(xiàng)目的一部分,你需要計(jì)劃和開(kāi)發(fā)一個(gè)監(jiān)控系統(tǒng),來(lái)提醒你數(shù)據(jù)上出現(xiàn)的不一致和爬蟲(chóng)錯(cuò)誤。在Scrapinghub,我們開(kāi)發(fā)了機(jī)器學(xué)習(xí)算法用于檢測(cè):
- 數(shù)據(jù)驗(yàn)證錯(cuò)誤:每條數(shù)據(jù)都有定義好的數(shù)據(jù)類型和需要遵循的賦值模式。如果數(shù)據(jù)項(xiàng)的數(shù)據(jù)類型不一致,我們的數(shù)據(jù)驗(yàn)證算法會(huì)通知QA團(tuán)隊(duì),由他們負(fù)責(zé)手動(dòng)檢查數(shù)據(jù),經(jīng)過(guò)驗(yàn)證后返還或標(biāo)記成錯(cuò)誤。
- 產(chǎn)品差異錯(cuò)誤:當(dāng)從同一個(gè)網(wǎng)站的不同版本(不同語(yǔ)言、地區(qū)等)抓取同一個(gè)產(chǎn)品數(shù)據(jù)時(shí),可能會(huì)有所不同,且理應(yīng)固定的值(例如產(chǎn)品重量、尺寸等)也有可能變化。這有可能是網(wǎng)站的反機(jī)器人策略給出了一個(gè)或多個(gè)虛假信息。同樣,你需要合適的算法來(lái)識(shí)別和標(biāo)記此類數(shù)據(jù)。
- 卷上數(shù)據(jù)的不一致:另一個(gè)關(guān)鍵的監(jiān)控腳本是檢測(cè)返回的記錄數(shù)量的異常變化。這可能表示網(wǎng)站已經(jīng)做了修改,或者你的爬蟲(chóng)拿到的是虛假信息。
- 網(wǎng)站更新:目標(biāo)網(wǎng)站的結(jié)構(gòu)變化是造成爬蟲(chóng)崩潰的主要原因。我們有專門(mén)的監(jiān)控系統(tǒng),非常積極地監(jiān)控這種情況。該工具會(huì)頻繁地檢查目標(biāo)站點(diǎn),確保自上次抓取以來(lái)沒(méi)有任何變化。一旦發(fā)現(xiàn)變化,它會(huì)發(fā)出通知。
[title]總結(jié)[/title]
如你所見(jiàn),大規(guī)模抓取產(chǎn)品數(shù)據(jù)需要面臨一系列獨(dú)特的挑戰(zhàn)。希望這篇文章可以讓你更加了解這些挑戰(zhàn)以及如何解決這些挑戰(zhàn)。
在Scrapinghub,我們專注于將非結(jié)構(gòu)化Web數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)。如果你對(duì)本文有任何想法,請(qǐng)?jiān)谙旅媪粞浴?/p>
文:Ian Kerins ?譯:彎月/CSDN(CSDNnews)
增長(zhǎng)黑客CGO薦讀產(chǎn)品運(yùn)營(yíng):
- 《產(chǎn)品數(shù)據(jù)運(yùn)營(yíng)-海盜指標(biāo)及三個(gè)增長(zhǎng)方法》
- 《增長(zhǎng)高手的幾個(gè)特質(zhì):務(wù)實(shí),好奇,溯本求源,累積》
- 《鑒鋒:4小時(shí)百萬(wàn)PV、7日留存69.3%的小程序增長(zhǎng)運(yùn)營(yíng)經(jīng)驗(yàn)復(fù)盤(pán)》
更多精彩,關(guān)注:增長(zhǎng)黑客(GrowthHK.cn)
增長(zhǎng)黑客(Growth Hacker)是依靠技術(shù)和數(shù)據(jù)來(lái)達(dá)成各種營(yíng)銷目標(biāo)的新型團(tuán)隊(duì)角色。從單線思維者時(shí)常忽略的角度和高度,梳理整合產(chǎn)品發(fā)展的因素,實(shí)現(xiàn)低成本甚至零成本帶來(lái)的有效增長(zhǎng)…
本文經(jīng)授權(quán)發(fā)布,不代表增長(zhǎng)黑客立場(chǎng),如若轉(zhuǎn)載,請(qǐng)注明出處:http://m.gptmaths.com/cgo/product/13757.html