爬蟲之代理池維護

NGU發表於2018-08-18

前言

做過爬蟲的應該都知道,在爬取反爬比較強的網站如果同一時間獲取的資料量過大就會導致封IP,例如豆瓣,搜狗之類的。那麼我們我們的策略就是搭建自己的代理池,Cookie池,使得爬蟲更像是普通使用者在操作一樣以此來解決目標網站封IP的問題。在網上有大量公開的免費代理,如果經濟基礎可以的話,我們也可以購買付費的代理IP,用過的人也應該知道,無論是免費的還是付費的,其實都不能保證是可用的,因為可能此IP也會被其他人用來爬取同樣的目標站點而封禁,或者代理伺服器突然發生故障或網路繁忙。一旦我們選用了一個不可用的代理,這勢必會影響爬蟲的工作效率。所以我們需要提前做篩選,將不可用的代理剔除掉,從而保留可用的代理。小編今天就給大家帶來如何搭建一個高效易用的代理池。


準備工作

首先需要成功安裝Redis資料庫並啟動服務,另外還需要安裝aiohttp、request、redis-py、pyquery、Flask庫,Redis安裝可以參見百度。


代理池的目標

我們需要做到下面的幾個目標,來實現易用高效的代理池

基本模組分為4塊:儲存模組,獲取模組,檢測模組,介面模組。


儲存模組:負責儲存抓取下來的代理。首先要保證代理不重複,要標識代理的可用情況,還有動態實時處理每個代理,所以一種比較高效和方便的儲存方式就是使用Redis的Sorted

Set,即有序集合。,儲存模組同時也是4個模組中的中心模組和基礎模組,將其他模組串聯起來。


獲取模組:需要定時在各大代理網站抓取代理。代理可以是免費公開代理也可以是付費代理,代理的形式都是IP加埠,此模組儘量從不同來源獲取,儘量抓取高匿代理,抓取成功之後將可用代理儲存到資料庫中。


檢測模組:需要定時檢測資料庫中的代理。這裡需要設定一個檢測連結,最好是爬取那個網站就檢測那個網站,這樣更加有針對性,如果要做一個通用型的代理,那可以設定百度等連結來檢測。另外,我們需要標識每一個代理的狀態,如設定分數標識,10分表示可用,分數越少代表越不可用。檢測一次,如果代理可用,我們可以將分數標識立即設定為滿分10分,或者在原來的基礎上加1分;如果代理不可用,可以將分數標識減1分,當分數減到一定閥值後,代理就直接從資料庫移除,通過這樣的標識分數,我們就可以辨別代理的可用情況,選用的時候會更有針對性。


介面模組:需要用API來提供對外服務的介面。其實我們可以直接連線資料庫來取對應的資料,但是這樣就需要知道資料庫的連線資訊,並且要配置連線,而比較安全和方便的方式就是提供一個Web API介面,我們通過訪問介面即可拿到可用代理。另外,由於可用代理可能有多個,那麼我們可以設定一個隨機返回某個可用代理的介面,這樣就能保證每個可用代理都可以取到,實現負載均衡。


設計思路已經很明確了,現在我們就用程式碼來實現代理池。

首先是儲存模組,我們需要定義一個類來運算元據庫的有序集合,定義一些方法來實現分數的設定、代理的獲取等。核心程式碼如下:


爬蟲之代理池維護

爬蟲之代理池維護


其次是獲取模組,獲取模組的邏輯相對簡單,只需要寫一個爬蟲來從各大網站抓取代理就可以了。核心程式碼如下:

爬蟲之代理池維護

爬蟲之代理池維護

方便起見,我們將獲取代理的每個方法統一定義為crawl開頭,這樣擴充套件的時候只需要新增crawl開頭的方法即可。這裡實現了幾個示例,爬取的大都是網上的免費網站,還有小白購買的付費代理(現在已經不能用了),如果你有自己的付費代理,也只需要新增到裡面即可。每個代理方法都定義成了生成器,通過yeild返回一個個代理。程式首先獲取網頁,然後用解析庫進行解析,解析出IP加埠的形式然後返回。

然後定義了一個get_proxies()方法,將所有的以crawl開頭的方法呼叫一遍,獲取每個方法返回的代理並組合成列表形式返回。這裡我們用元類來實現這個方法。程式碼如下:

爬蟲之代理池維護

最後定義了一個Getter類,用來動態的呼叫所有以crawl開頭的方法,然後獲取抓到的代理,將其加入到資料庫儲存起來:

爬蟲之代理池維護


我們已經成功的將各個網站的代理獲取下來了,現在就需要檢測模組來對所有代理進行多輪檢測。代理檢測可用,分數就設定為10,不可用就丟棄或者減1,這樣就可以實時改變每個代理的可用情況。如要獲取有效代理只需要獲取分數高的代理即可。由於代理的數量非常多。為了提高檢測效率,我們在這裡使用了非同步請求庫aiohttp來進行檢測。

爬蟲之代理池維護


為了方便的獲取代理和使代理池可以作為一個獨立服務執行,我們增加了一個介面模組,並以Web API的形式暴露可用代理。

爬蟲之代理池維護


最後通過排程模組呼叫呼叫以上模組以多執行緒方式執行起來。

爬蟲之代理池維護


最後我們執行一下


爬蟲之代理池維護


爬蟲之代理池維護


再開啟瀏覽器配置的API介面 http://127.0.0.1:5555,即可看到其首頁。

爬蟲之代理池維護


再訪問http://127.0.0.1:5555/random,即可獲取隨機可用代理。

爬蟲之代理池維護


到此我們的代理池就已經搭建成功了。有了代理池,爬蟲就會方便許多。另外小編建議如果搭建自己的代理池,最好是選擇付費代理。畢竟穩定性高一些。網上的免費代理在爬取某些網站還是比較吃力。


讀者如果有需要ADSL代理池搭建的思路,可以在公眾號後臺留言。後續會給出Cookie池搭建的方案。


完整程式碼地址獲取可在公眾號後臺回覆【代理池】獲得


對爬蟲,資料分析,演算法感興趣的朋友們,可以加微信公眾號 TWcoding,我們一起玩轉Python。


If it works for you.Please,star.


自助者,天助之









爬蟲之代理池維護




相關文章