Python3網絡爬蟲課程 9.4Proxy 池

Proxy 池

網上存在者大量的 Proxy,也有很多的付費 Proxy,不論是免費的還是付費的,都未必是可用的,因為這個 Proxy 可能被其他人使用訪問相同的目標站點而被封禁,或者 Proxy 服務器發生故障,或者網絡問題等等,都有可能導致此 Proxy 不可用,一旦我們選用了一個不可用 Proxy,勢必會影響我們抓取的效率。
所以,一般我們開始抓取之前,都需要對代理進行篩選,將不可用的代理篩掉。

準備

  • 我們要安裝 Redis 內存數據庫。

  • 安裝 aiohttp

  • 安裝 requests

  • 安裝 redis-py

  • 安裝 pyquery

  • 安裝 Flask
    具體的安裝方法請看第一節、第二節的內容。

  • 目標

    我們的 Proxy 池需要實現以下幾個功能。

    存儲

    負責存儲抓取下來的 Proxy。首先應該保證 Proxy 是唯一的、不重複的,需要表示 Proxy 的可用情況,其次要動態實時的處理每個代理,所以我們這裡使用 Redis 的 SortedSet 來存儲 Proxy。

    獲取

    定時在各個提供 Proxy 的網站上抓取 Proxy,可以是免費公開的 Proxy,也可以是付費的 Proxy,儘量從不同來源獲取 Proxy,儘量抓取匿名 Proxy,成功後將其存入 Redis 的 SortedSet 中。

    檢測

    定時檢測 Redis 中的 Proxy,最好設置一個檢測鏈接,一般來說我們需要訪問那個目標網站我們就檢測哪個網站,這樣針對性更好,如果要做通用性的 Proxy,那我們可以設置百度為檢測網站。另外我們需要標識每一個 Proxy 的狀態,比如設置分數,一百分表示可用,零分表示不可用,刪除此 Proxy,分數越小表示此 Proxy 越不可用。檢測一次,如果 Proxy 可用,我們將分數直接設置為一百滿分,當然,也可以在原分基礎上加一,策略大家可以自己選擇;如果 Proxy 不可用,我們將分數減一,當分數減少到一定閾值之後,我們從 Redis 中刪除這個 Proxy,當然,也可能當分數是零的時候再刪除。通過這樣的分數標識,我們可以識別 Proxy 的可用情況。

    接口

    我們可以提供一個 HTTP API 來對外提供服務。當然,我們也可以直接查詢數據庫來獲取響應的 Proxy,但是這樣得知道數據庫的相關信息,並且還需要做數據庫相關的配置,比較方便的方法是提供一個 WEB API 接口,這樣可以在不暴露數據庫信息的情況下對外提供通用的接口。由於 Proxy 可能又多個可用,我們可以隨機返回某個 Proxy,這樣可以保證每個可用的 Proxy 取到的機會均等。

    架構

    根據功能模塊,我們的 Proxy 池架構如下:

    Python3網絡爬蟲課程 9.4Proxy 池

    存儲模塊是 Redis 的有序集合,用來做 Proxy 的去重和可用標識。
    獲取模塊是從各個網站獲取 Proxy,然後將 Proxy 傳遞給存儲模塊,保存到數據庫。
    檢測模塊定時檢測 Redis 中的所有 Proxy,根據不同的結果對其進行不同的標識。
    接口模塊通過 WEB API 對外提供通用接口。


分享到:


相關文章: