1. 程式人生 > >生成和維護一個動態代理池

生成和維護一個動態代理池

為什麼需要代理,這個就不需要再多做贅述了。現在在網上有許多的免費代理網站,但是用的時候就會發現,那些是真滴不好用,好用點的也都是需要收費的。所以為了省錢(土豪請自便),就需要做自己做一個動態的代理池,在網上不斷的爬取有用的代理放入代理池中,定時的檢測和更新,然後在使用的時候就直接在自己的代理池中呼叫就好了。現在在github上有許多的動態代理池的架構,這個是別人視訊中提到的,肯定是一個很厲害的大神寫的。當然也可能有其他更好用的,如果需要的話可以自己尋找。

這個架構主要是使用Redis和Flask來實現和維護的,原始碼地址在:https://github.com/germey/proxypool。先分析一下整個程式碼的結構:整個程式碼大致分為兩塊,一個是執行例項,另外一個就是代理池的核心程式碼。下面有兩個檔案:run.py和setup.py,在終端執行python run.py就可以整個執行這個程式碼了,執行的時候請確保你的redis服務是開啟的。

開啟run檔案,就能發現整個程式碼主要就是呼叫了schedule.py和api.py,api其實就是用flask寫的一個介面,主要的程式碼其實是在排程器上的。而在schedule.py中的run方法上,其實是重新建立了兩個程序:一個負責從網上獲取代理,一個從資料庫中讀取代理並進行檢測。

檢視下獲取和儲存代理的方法即valid_proxy,在方法中聲明瞭一個conn物件,ctrl+右鍵點選RedisClient,會進入到了db.py,這個是資料庫的配置和方法,其中get方法中lrange和put方法中的rpush能夠知道資料庫的資料是從佇列右側放入從左側提取的,這樣就保證了資料的更新性,右側的資料永遠比左側的要新。pop方法中使用了rpop,這個意思就是從右側取出最新的代理,能保證代理的有效性。queue_len是佇列的長度,flush是重新整理整個佇列。這個類(RedisClient)主要是提供了佇列的相關api操作。宣告的第二個物件是tester,這個主要是用於檢測代理是否可用的。在class  ValidityTester中最主要的方法就是test_single_proxy,它用了async,這個就是利用aiohttp這個庫實現非同步檢測的一個方法(python3.5版本以後),每一個方法前面都需要使用async這個識別符號。在測試前首先是組成真正的代理,在前面加上"http://",然後進行真正的測試方法就是:

其實就是獲取test_api,這個api是一個全域性的變數,在setting中,我們可以知道它其實就是百度。如果能正常訪問的話,就存入到資料庫,放入佇列的右側。在排程器的方法valid_proxy中將可用的代理存入到佇列裡,不可用的代理剔除。而且在方法中也有一個關於佇列長度的判斷,如果長度不夠的話,就進入睡眠等待模式。這樣就保證了代理的更新。

第二個程序就是檢查代理池,在setting中也限定了代理池數量的大小:

就是代理池的數量界限,如果小於10的時候,就會獲取代理,大於100的時候回停止獲取。

            在getter.py中是從網頁獲取代理的方法。定義了兩個類,一個是元類:ProxyMetaclass,另一個是爬蟲函式類: FreeProxyGetter,通過不同的爬蟲方法獲取不同網站的代理,然後返回一個生成器,就實現了不同網站的代理爬取。這個程式碼的可擴充套件性非常強,如果想要再新增不同網站的爬蟲,只要重新定義一個以"crawl_"為開頭的爬蟲方法就行了。

這個架構的原始碼地址是“https://github.com/germey/proxypool”,有需要的話可以自行下載。