5個(gè)用python編寫(xiě)非阻塞web爬蟲(chóng)的方法
前言
大家在讀爬蟲(chóng)系列的帖子時(shí)常常問(wèn)我怎樣寫(xiě)出不阻塞的爬蟲(chóng),這很難,但可行。通過(guò)實(shí)現(xiàn)一些小策略可以讓你的網(wǎng)頁(yè)爬蟲(chóng)活得更久。那么今天我就將和大家討論這方面的話題。
用戶代理
你需要關(guān)心的第一件事是設(shè)置用戶代理。 用戶代理是用戶訪問(wèn)的工具,并告知服務(wù)器用戶正在使用哪個(gè)網(wǎng)絡(luò)瀏覽器訪問(wèn)網(wǎng)站。 如果未設(shè)置用戶代理,許多網(wǎng)站不會(huì)讓你查看內(nèi)容。 如果你正在使用rquests庫(kù),可以執(zhí)行如下操作:
你可以通過(guò)在 Google 搜索欄中輸入 User-Agent 來(lái)獲取用戶代理的信息,并且它會(huì)返回你當(dāng)前的用戶代理信息。
現(xiàn)在,你已經(jīng)有了一個(gè)用戶代理,但如何去使用它? 那么,最好的方法是從文本文件、數(shù)據(jù)庫(kù)、Python 的列表中選擇一個(gè)隨機(jī)的 User-Agent 。 Udger 分享了大量的 UA w.r.t 瀏覽器。 比如,對(duì)于 Chrome 而言,它看起來(lái)像這樣,對(duì) Firefox 來(lái)說(shuō),又像這樣。 現(xiàn)在讓我們來(lái)創(chuàng)建一個(gè)函數(shù),它將返回一個(gè)隨機(jī) UA ,你可以在請(qǐng)求中使用:
ua_file.txt 包含一個(gè)來(lái)自我上面共享的網(wǎng)站的每行 UA 。 函數(shù) get_random_ua 將始終從該文件中返回唯一的 UA 。 你現(xiàn)在可以調(diào)用如下函數(shù):
Referrers
接下來(lái)你需要設(shè)置的是引用。 一般的規(guī)則是,如果它是一個(gè)列表頁(yè)面或主頁(yè),那么你可以設(shè)置該國(guó)家的 Google 主頁(yè)網(wǎng)址。
如果你要抓取各個(gè)產(chǎn)品頁(yè)面,可以在引用中設(shè)置相關(guān)類別的網(wǎng)址,或者可以找到要抓取的域的反向鏈接。 我通常使用 SEMRush 來(lái)這么做。
如果你點(diǎn)擊查看放大的圖像,你可以看到一些鏈接指向我所需的類別。一旦你收集所有這些真實(shí)的反向鏈接,你可以通過(guò)復(fù)制邏輯 insideget_random_ua()返回隨機(jī)引用,并將它們用作引用。 如下所示:
代理IP
我不得不強(qiáng)調(diào)這一點(diǎn)。如果認(rèn)真研究,那么你必須使用多個(gè)代理 IP 來(lái)避免阻塞。 大多數(shù)網(wǎng)站會(huì)根據(jù)你的服務(wù)器或主機(jī)提供商的靜態(tài) IP 來(lái)阻止抓取工具。 這些網(wǎng)站使用智能的工具來(lái)確定某個(gè) IP 或 IP 池的方式,并簡(jiǎn)單地阻止它們。 這也是為什么建議購(gòu)買(mǎi)幾個(gè) IP 地址,50-100個(gè)至少要避免阻塞。有許多可用的服務(wù),但我對(duì) Shaders(現(xiàn)在稱為 OxyLabs )感到滿意。 它們雖然很貴,但服務(wù)質(zhì)量很好。 確保你在訂購(gòu)多個(gè) IP 時(shí),要求提供隨機(jī) IP 或至少不遵循 1.2.3.4 到 1.2.3.100 等特定模式。站點(diǎn)管理員將很簡(jiǎn)單的設(shè)置 IP 地址不全部為 1.2.3.* 。 就這么簡(jiǎn)單。
如果你正在使用請(qǐng)求,你可以像下面這樣使用它:
如果你在 Selenium 使用代理 IP ,那么這將有點(diǎn)棘手。
不用說(shuō),get_random_proxy() 是返回一個(gè)唯一且隨機(jī)代理的方法,就像上面獲得唯一且隨機(jī)的 UA 和 Referer 一樣。
你可以思考一個(gè)這樣的系統(tǒng),在系統(tǒng)中你可以設(shè)置一個(gè) IP 每天或每小時(shí)訪問(wèn)網(wǎng)站頻率,如果它超過(guò)了,那么它將被放入一個(gè)籠子里直到第二天。 我所在的公司設(shè)計(jì)了一個(gè)這樣的系統(tǒng),不僅設(shè)置了 IP 訪問(wèn)頻率,還記錄了哪個(gè) IP 被阻止。 最后,我只是使用代理服務(wù)提供者僅替換這些代理。 由于這超出了本文的范圍,所以我不會(huì)詳細(xì)介紹它。
Request Heaters
到目前為止,事情你都已經(jīng)做得很好,但是仍然有些狡猾的網(wǎng)站要求你做更多的事情。當(dāng)你訪問(wèn)頁(yè)面的時(shí)候他們會(huì)查找特定的請(qǐng)求響應(yīng)頭信息,如果特定的頭信息沒(méi)有被發(fā)現(xiàn),他們會(huì)阻止內(nèi)容顯示或者展示一個(gè)虛假的內(nèi)容。模擬一個(gè)你想訪問(wèn)的網(wǎng)站的請(qǐng)求是非常簡(jiǎn)單的。例如,比如你正準(zhǔn)備訪問(wèn)一個(gè) Craigslist URL ,并且想知道哪個(gè)頭部信息是需要的。進(jìn)入 Chrome/Firefox 瀏覽器,檢查正在訪問(wèn)的頁(yè)面,你應(yīng)該會(huì)看到下面這些內(nèi)容:
如果你點(diǎn)擊了圖標(biāo)并查看,你能找到除了 referer 和 user-agent 之外的大量信息。你能一次性全都實(shí)現(xiàn)也可以一個(gè)個(gè)的實(shí)現(xiàn)并測(cè)試。無(wú)論訪問(wèn)哪個(gè)網(wǎng)站,我總是去設(shè)置這些信息。請(qǐng)確保你不只是復(fù)制粘貼這些信息去訪問(wèn)所有網(wǎng)站,因?yàn)檫@些信息通常會(huì)因網(wǎng)站不同而改變。
延遲
在請(qǐng)求之間放置一些延遲總是很好的。我使用 numpy.random.choice() 來(lái)實(shí)現(xiàn)這一目標(biāo),該函數(shù)將在我想延遲的服務(wù)中傳遞隨機(jī)數(shù)列表:
如果你還沒(méi)有使用過(guò) numpy 庫(kù),你也可以使用 random choice 來(lái)達(dá)到同樣的目的。
如果你真的很急,那么你可以并行執(zhí)行 URL ,我之前在此文中解釋過(guò)了。
結(jié)語(yǔ)
Web 爬蟲(chóng)被阻塞的不確定性永遠(yuǎn)不會(huì)變?yōu)榱,但你總是可以采取一些措施?lái)規(guī)避它。我討論了一些你應(yīng)該以某種或其他方式在 web 爬蟲(chóng)中實(shí)現(xiàn)的策略。
如果你知道其他策略或技巧,請(qǐng)通過(guò)分享評(píng)論讓我獲知。一如既往地,期待你的反饋。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書(shū)】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬(wàn) APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語(yǔ)權(quán)
- 3 深度報(bào)告|中國(guó)AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 6 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 7 百億AI芯片訂單,瘋狂傾銷中東?
- 8 Robotaxi新消息密集釋放,量產(chǎn)元年誰(shuí)在領(lǐng)跑?
- 9 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過(guò)于簡(jiǎn)單
- 10 “搶灘”家用機(jī)器人領(lǐng)域,聯(lián)通、海爾、美的等紛紛入局