5 個用 Python 編寫 web 爬蟲的方法

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

你們在讀爬蟲系列的帖子時經常問我怎樣寫出不阻塞的爬蟲,這很難,但可行。經過實現一些小策略可讓你的網頁爬蟲活得更久。那麼今天我就將和你們討論這方面的話題。python

我剛整理了一套2018最新的0基礎入門和進階教程,無私分享,加python學習q-u-n :二二七,四三五,四五零 便可獲取,內附:開發工具和安裝包,以及系統學習路線圖

用戶代理

你須要關心的第一件事是設置用戶代理。 用戶代理是用戶訪問的工具,並告知服務器用戶正在使用哪一個網絡瀏覽器訪問網站。 若是未設置用戶代理,許多網站不會讓你查看內容。 若是你正在使用rquests庫,能夠執行以下操做:web

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

你能夠經過在 Google 搜索欄中輸入 User-Agent 來獲取用戶代理的信息,而且它會返回你當前的用戶代理信息。數據庫

如今,你已經有了一個用戶代理,但如何去使用它? 那麼,最好的方法是從文本文件、數據庫、Python 的列表中選擇一個隨機的 User-Agent 。 Udger 分享了大量的 UA w.r.t 瀏覽器。 好比,對於 Chrome 而言,它看起來像這樣,對 Firefox 來講,又像這樣。 如今讓咱們來建立一個函數,它將返回一個隨機 UA ,你能夠在請求中使用:網頁爬蟲

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

ua_file.txt 包含一個來自我上面共享的網站的每行 UA 。 函數 get_random_ua 將始終從該文件中返回惟一的 UA 。 你如今能夠調用以下函數:瀏覽器

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

Referrers

接下來你須要設置的是引用。 通常的規則是,若是它是一個列表頁面或主頁,那麼你能夠設置該國家的 Google 主頁網址。 例如,若是我正在爬取 olx.com.pk ,那麼我會設置 https://google.com.pk 而不是 https://google.ca。服務器

若是你要抓取各個產品頁面,能夠在引用中設置相關類別的網址,或者能夠找到要抓取的域的反向連接。 我一般使用 SEMRush 來這麼作。針對連接 https://www.olx.com.pk/furniture-home-decor/categories/ 經過 SEMRush 會返回以下所示的內容:網絡

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

 

若是你點擊查看放大的圖像,你能夠看到一些連接指向我所需的類別。一旦你收集全部這些真實的反向連接,你能夠經過複製邏輯 insideget_random_ua()返回隨機引用,並將它們用做引用。 以下所示:dom

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

代理 IP

我不得不強調這一點。若是認真研究,那麼你必須使用多個代理 IP 來避免阻塞。 大多數網站會根據你的服務器或主機提供商的靜態 IP 來阻止抓取工具。 這些網站使用智能的工具來肯定某個 IP 或 IP 池的方式,並簡單地阻止它們。ide

這也是爲何建議購買幾個 IP 地址,50-100個至少要避免阻塞。有許多可用的服務,但我對 Shaders(如今稱爲 OxyLabs )感到滿意。 它們雖然很貴,但服務質量很好。 確保你在訂購多個 IP 時,要求提供隨機 IP 或至少不遵循 1.2.3.4 到 1.2.3.100 等特定模式。站點管理員將很簡單的設置 IP 地址不所有爲 1.2.3.* 。 就這麼簡單。函數

若是你正在使用請求,你能夠像下面這樣使用它:

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

若是你在 Selenium 使用代理 IP ,那麼這將有點棘手。

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

不用說,get_random_proxy() 是返回一個惟一且隨機代理的方法,就像上面得到惟一且隨機的 UA 和 Referer 同樣。

你能夠思考一個這樣的系統,在系統中你能夠設置一個 IP 天天或每小時訪問網站頻率,若是它超過了,那麼它將被放入一個籠子裏直到次日。 我所在的公司設計了一個這樣的系統,不只設置了 IP 訪問頻率,還記錄了哪一個 IP 被阻止。 最後,我只是使用代理服務提供者僅替換這些代理。 因爲這超出了本文的範圍,因此我不會詳細介紹它。

Request Headers

到目前爲止,事情你都已經作得很好,可是仍然有些狡猾的網站要求你作更多的事情。當你訪問頁面的時候他們會查找特定的請求響應頭信息,若是特定的頭信息沒有被發現,他們會阻止內容顯示或者展現一個虛假的內容。模擬一個你想訪問的網站的請求是很是簡單的。

例如,好比你正準備訪問一個 Craigslist URL ,而且想知道哪一個頭部信息是須要的。進入 Chrome/Firefox 瀏覽器,檢查正在訪問的頁面,你應該會看到下面這些內容:

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

若是你點擊了圖標並查看,你能找到除了 referer 和 user-agent 以外的大量信息。你能一次性全都實現也能夠一個個的實現並測試。

不管訪問哪一個網站,我老是去設置這些信息。請確保你不僅是複製粘貼這些信息去訪問全部網站,由於這些信息一般會因網站不一樣而改變。

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

延時

在請求之間放置一些延遲老是很好的。我使用 numpy.random.choice() 來實現這一目標,該函數將在我想延遲的服務中傳遞隨機數列表:

經常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法

 

若是你尚未使用過 numpy 庫,你也可使用 random.choice 來達到一樣的目的。

若是你真的很急,那麼你能夠並行執行 URL。

結語

Web 爬蟲被阻塞的不肯定性永遠不會變爲零,但你老是能夠採起一些措施來規避它。我討論了一些你應該以某種或其餘方式在 web 爬蟲中實現的策略。

若是你知道其餘策略或技巧,請經過分享評論讓我獲知。一如既往地,期待你的反饋。

相關文章
相關標籤/搜索