代理IP池如何維護
在爬取數據的時候,遇到了IP被封殺的情況。為了順利開展工作,會選用代理IP,以下分享爬蟲工作經驗,全球HTTP對代理IP池的維護提供一些見解。
在使用代理ip之前,需要先了解:
一:對返回ip格式的操作
json格式的數據可以直接請求后返回json數據進行操作包過提取,刪除,增加。當然,在實際使用ip代理的時候好先在瀏覽器中請求一次,復制下來新建一個py文件練習對其操作。
二:ip的有效期
現在大部分的ip代理都是有有效期的,1-5分鐘的有效期當ip失效后你需要將此ip從ip池中刪除。當ip不夠的時候又要引入新的ip添加到當前的ip池中。要動態維護ip池。
三:python3使用代理ip的方式
以前我的python3使用代理ip也有格式,你爬取的是http用http,是https用https就行。
四:異常處理
再寫爬蟲的時候一定要對所有可能產生異常的操作進行try except的異常處理。異常又要注意是否為超時異常,還是ip不可用,過期的異常,還是操作dom樹的時候產生的異常。不同的異常要采用不同的策略。(可用狀態碼,全局變量判斷)。
五:分析目標網站對ip的需求
你需要設置ip池的小和請求ip的個數不至于太大或太小,可以預先測試。打個比方你爬的網站同一個時段10個ip更換就不夠了。你不至于開100個ip去爬吧,ip過期而沒咋么用就是對資源的浪費。
解決方向:
先寫個小程序操作返回的json數據測試。
設置全局的列表ipdate[],全局的一個msg{}字典(其實字典就是列表中隨機選的一個ip和端口,只不過通過記錄標記可以很好的進行刪除操作)。
將請求ip的操作添加到全局列表(數組)中寫成一個loadip()函數,以便判斷ip不夠時候即使添加(列表extend方法了解下,不是append)。
寫一個隨機選ip的函數getproxies(),更換proxies{}里面的內容。同時msg也要更換。注意python函數改變全局變量需要在函數里先global msg聲明。每次進行http(s)請求前執行一次更新操作。
所有的操作都在try excpet操作,對不同的異常采用不同處理。比如(有的因為ip異常沒爬到需要從爬,而有的因為dom結構異常就需要跳過)。
當然實際處理可能會遇到各種問題,比如頁面跳轉重定向,ssl證書,有的網站也會卡瀏覽器名稱,或者cookie。這里不做過多介紹了。