代理IP設置
本文分為如下部分
- 引言
- requests代理IP設置
- 免費代理IP
- 付費代理IP
- 代理ip池創建思路
引言
我們請求一個網頁時,不僅攜帶著headers等信息,而且會帶一個ip地址。如果你一直攜帶著同一個ip地址,去大量快速請求同一個域名下的網頁,網站就會識別出這是同一個人(同一個ip)在大量請求他的網站,這時往往會把你的ip封掉,或者彈出驗證碼驗證你是不是機器。
如果試一下用python不加任何約束,成百上千次地循環訪問豆瓣電影頁面,會發現一段時間後爬蟲報錯,無法抓取到信息。這時如果你用瀏覽器登錄豆瓣的網站,也會發現登不進去,因為你這個ip已經被封掉了,無論用python還是瀏覽器請求都沒有用。這時你如果換一個wifi,就又可以正常訪問了。
這種反爬蟲方式只有當你大規模抓取網頁時才會出現,如果你只是想抓取豆瓣top250個電影信息,請求次數非常少,則只使用自己的一個ip就不會被封。
用python做爬蟲時,要想繞過這道反爬蟲機制,一般有兩種方法
- 降低抓取速度。比如每兩次請求之間間隔2秒,即設置
time.sleep(2)
(事先import time
)。(你user-agent等偽裝得當的情況下,如果2秒請求一次,這是人手動也可以操作出來的,網站就不敢確定你是一個爬蟲程序,只有統一個ip 1秒請求很多次,網站才會直接判斷你是爬蟲)有時設置隨機sleep時間,防止網站識別出你訪問時間太過均勻 - 可以設置代理IP,使用不斷變化的IP來請求,這樣就不會被判定為同一個人,請求非常快也無法被判定為爬蟲。大量抓取時,如果不想以犧牲爬蟲速度為代價獲取數據,一般都要設置代理IP。
要想獲得代理ip,主要有兩種途徑,一個是從免費代理ip網站上獲得,另一個是購買付費代理。
就我個人而言,平時要抓取的數據大都在千或者萬的級別,需要使用代理ip。但是爬蟲只運行幾個小時也就能結束了,因此我會選擇按小時購買付費代理IP。如果數據量再大,需要跑幾天幾個月這種的,使用付費代理就比較貴了。
付費代理IP比較穩定,而且操作比較簡單。下文我們就分別講解付費代理IP和免費代理IP的設置。
requests代理IP設置
首先介紹一個網站
http://httpbin.org/ip
這是一個ip測試網站,你在瀏覽器打開這個網址,就可以看到你當前使用的ip,比如我的就是
如果你用requests請求的話,得到的也是瀏覽器中顯示的內容,表示你這次請求時的IP
>>> import requests>>> r = requests.get(http://httpbin.org/ip)>>> print(r.text){ "origin": "59.77.43.8"}
如果你設置了一個代理ip的話,它就會顯示你設置的ip,下面我們用requests實現代理IP設置
import requests>>> proxies = {... http: http://180.160.103.185:8118,... https: https://180.160.103.185:8118... }>>> r = requests.get(http://httpbin.org/ip, proxies = proxies)>>> print(r.text){ "origin": "180.160.103.185"}
其中1180.160.103.185:8118
就是我們要找的代理IP,前半部分180.160.103.185
是ip,後半部分8118
是埠(port),兩者都要有。
上面代碼讀者運行多半會報錯,因為這個代理ip在我寫文章時有效,在讀者看文章時多半會失效了,帶著失效的ip訪問則拋出異常。
下面我們來簡單介紹從免費代理網站上獲取代理ip。
免費代理IP
免費代理IP平台非常多,比如西刺、3464網等,他們的樣子都是類似
其中代理ip地址和埠就是我們想要的值。我們可以從這裡複製到我們上面的代碼中,看這個ip是否有效。測試之後發現這些免費代理ip非常多是無效的(即攜帶它去requests會報錯)
如果我們真的要基於免費代理IP進行大規模爬蟲,不可能像上節那樣一個個指定,需要使用爬蟲不斷從免費代理網站上抓取這些ip存到資料庫中,並經常檢驗它們是否有效,將無效ip剔除。然後每次請求都自動從資料庫中提取IP,構造proxies
變數。這是代理ip池的維護問題,它的實現思路會在本文最後一節詳細說。
那麼我們如果不想自己建一個代理IP池,就不能用這些免費代理了嗎?
當然不是。代理ip池也是有人造好了輪子,比如這個項目,可以看它的介紹,需要事先如何配置環境,然後就可以愉快地調用這些ip了。但是從免費代理網站上獲得的IP質量一般比較低,很難保證從IP池中提取的IP都是有效的。如果不想再折騰一些異常處理,或者改進這個IP池,就選擇付費IP吧。
除此之外,可以參考剛剛這個項目後面列出的同類項目
我們可以嘗試這些項目哪一個的效果最好。而且這些項目的源代碼也是學習構建代理ip池的絕佳材料。
其中這個項目實現了用scrapy抓取各大免費代理ip平台,如果不知道有哪些免費代理網站,可以看這個項目寫了對哪些代理ip網站的爬蟲
在我們配置好代理IP之後,可以先多次訪問https://httpbin.org/ip
這個網頁,看是否每一次都使用的是不同ip,然後再去抓取目標網站。
付費代理IP
我們上文說過,如果不是非常大規模的抓取,又不想折騰異常處理,最好選用付費代理IP。
要想使用付費代理IP,首先我們需要知道市面上有哪些平台提供,哪個平台比較好,以及各個平台怎麼用。
關於哪些平台提供,和各個平台的優缺點,已經有大佬總結好了,看下面這篇文章
爬蟲代理哪家強?十大付費代理詳細對比評測出爐!
這篇文章對站大爺、芝麻 HTTP 代理、太陽 HTTP 代理、訊代理、快代理、蘑菇代理、阿布雲代理、全網代理、雲代理、大象代理進行了對比評測。
下面我以阿布雲和芝麻代理為例講解付費代理的使用。
1.阿布雲
直接進入官網,選擇HTTP隧道,我一般使用的是動態版,看下面一張圖
點擊價格方案,選定後(要登錄後) 立即購買,在裡面對應位置選購隧道即可,見下面這張圖
購買後可以看到這樣的界面
這裡有通行證書和通行密鑰,需要在代碼中填入。下面我們來講一講如何在python中調用這個代理IP。
在最開始的界面中選擇接入指南,可以看到下面這個界面
這裡說明了在各個軟體中如何使用阿布雲,我們以python的requests庫為例來看一下(從下面這張圖中可以看到,scrapy等也都是支持的)
我們可以看到,將剛剛獲得的通行證書和通行密鑰放在proxyUser
和proxyPass
兩個變數中,最後構造出一個proxies作為requests.get
的參數,帶著這個參數請求網頁即使用了代理IP。
使用阿布雲時要注意(看阿布雲的第一張圖),它限制了每秒只能請求5次,所以我們要限制自己的爬蟲速度,如果超過這個速度,要麼購買更多次數,要麼降低抓取速度。
2.芝麻代理
在芝麻代理的獲取API選項中,可以先領取免費IP來看看這是怎麼用的,選好配置後點擊生成API鏈接,得到下圖
點擊打開鏈接可以看到
如果我們請求這個鏈接,可以得到上述內容。
>>> import requests>>> url = http://webapi.http.zhimacangku.com/getip?num=5&type=1&pro=&city=0&yys=0&port=1&pack=20005&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1®ions=>>> r = requests.get(url)>>> print(r.text)42.242.162.165:1246115.224.69.26:2314115.85.206.211:3012101.205.60.147:7135180.118.33.101:3217
芝麻代理沒有像阿布雲那麼友好,沒有提供配置代碼 只是提供了ip,以API(上面那個鏈接)的形式發給我們,我們需要自己去構造proxies,用
requests.get(url, proxies = proxies)
進行請求即可
構造proxies
的代碼如下
>>> ip = 42.242.162.165:1246>>> proxies = {http: http://{}.format(ip),... https: https://{}.format(ip)}>>> proxies{http: http://42.242.162.165:1246, https: https://42.242.162.165:1246}
代理ip池創建思路
本節我們只是簡單敘述代理ip池實現的原理,細節部分我會推薦一些資料供想深入了解的讀者學習。
這裡我們要搭建的代理ip池最好能像芝麻代理那樣,提供一個API(那個鏈接),當請求這個API時,就會返回一個代理ip。這樣獲取會比從資料庫中直接抽好。
下面給出一種ip代理池的實現思路
開啟三個進程
- 爬蟲程序,從免費代理網站上抓取ip,存儲到隊列中
- ip檢測程序,不斷對隊列中的ip進行檢測,將無法使用的ip去除
- API介面服務,便於IP調用
1.爬蟲程序
因為免費IP的可用性都比較低,所以需要用爬蟲抓取大量IP以備用。一般需要對多個免費的代理IP網站分別寫一個請求、解析的函數,然後同時運行這些爬蟲程序,將抓取到的IP整合到一起,存到資料庫中,等待調用。一般資料庫選擇redis。
比如我們要抓取3個代理ip網站,可以先把3個爬蟲代碼跑一遍,將三個網站中所有ip都存到資料庫中,然後sleep一段時間。時間到時對資料庫中ip數量進行判斷,如果數量依然很多,則不再抓取,再進入sleep;如果ip已經不夠了,則在執行相同的爬蟲,雖然是抓取和之前相同的網站,但是代理ip網站都是時刻更新的,這一次訪問就會獲得很多上一次沒有得到的ip。總之就是隔一段時間將所有免費ip網站全爬一遍。
這個思路用代碼呈現是這樣的
while True: if 數量 < 閾值: crawl time.sleep(100)
2.ip檢測程序
要新開一個進程,和上面爬蟲進程同時運行,將資料庫中的ip提取出來檢驗是否有效,將無效ip去除。檢驗的方法是用這個ip去訪問一個網站,比如百度首頁,看是否返回200等請求成功的狀態碼,如果返回失敗的狀態碼,則要從資料庫中去除這個ip。因為ip較多,檢驗時可以使用非同步等方式加快速度。也是設置sleep,隔一段時間檢測一次。
3.API介面服務
為了讓IP更容易調用,要設計出一個類似網頁的形式,請求一個URL就會獲得一個IP。可以基於Flask框架,非常簡單易上手。
下面推薦一些學習資源
對於基礎讀者,可以先看下面這篇文章
用Flask+Aiohttp+Redis維護動態代理池
這篇文章詳細解釋了一個代理ip池是如何構建起來的,有代碼,有解釋,非常適合初學者學習。
如果想對上面的ip池進行改進,可以參考其他代理ip池的項目,比如這個項目,還有它後面列出的其他項目
專欄信息
專欄主頁:python編程
專欄目錄:目錄
爬蟲目錄:爬蟲系列目錄
版本說明:軟體及包版本說明
推薦閱讀: