代理IP設(shè)置
時(shí)間:2023-02-10 18:30:01 | 來源:建站知識(shí)
時(shí)間:2023-02-10 18:30:01 來源:建站知識(shí)
本文分為如下部分
- 引言
- requests代理IP設(shè)置
- 免費(fèi)代理IP
- 付費(fèi)代理IP
- 代理ip池創(chuàng)建思路
引言
我們請求一個(gè)網(wǎng)頁時(shí),不僅攜帶著headers等信息,而且會(huì)帶一個(gè)ip地址。如果你一直攜帶著同一個(gè)ip地址,去大量快速請求同一個(gè)域名下的網(wǎng)頁,網(wǎng)站就會(huì)識(shí)別出這是同一個(gè)人(同一個(gè)ip)在大量請求他的網(wǎng)站,這時(shí)往往會(huì)把你的ip封掉,或者彈出驗(yàn)證碼驗(yàn)證你是不是機(jī)器。
如果試一下用python不加任何約束,成百上千次地循環(huán)訪問豆瓣電影頁面,會(huì)發(fā)現(xiàn)一段時(shí)間后爬蟲報(bào)錯(cuò),無法抓取到信息。這時(shí)如果你用瀏覽器登錄豆瓣的網(wǎng)站,也會(huì)發(fā)現(xiàn)登不進(jìn)去,因?yàn)槟氵@個(gè)ip已經(jīng)被封掉了,無論用python還是瀏覽器請求都沒有用。這時(shí)你如果換一個(gè)wifi,就又可以正常訪問了。
這種反爬蟲方式只有當(dāng)你大規(guī)模抓取網(wǎng)頁時(shí)才會(huì)出現(xiàn),如果你只是想抓取豆瓣top250個(gè)電影信息,請求次數(shù)非常少,則只使用自己的一個(gè)ip就不會(huì)被封。
用python做爬蟲時(shí),要想繞過這道反爬蟲機(jī)制,一般有兩種方法
- 降低抓取速度。比如每兩次請求之間間隔2秒,即設(shè)置
time.sleep(2)
(事先import time
)。(你user-agent等偽裝得當(dāng)?shù)那闆r下,如果2秒請求一次,這是人手動(dòng)也可以操作出來的,網(wǎng)站就不敢確定你是一個(gè)爬蟲程序,只有統(tǒng)一個(gè)ip 1秒請求很多次,網(wǎng)站才會(huì)直接判斷你是爬蟲)有時(shí)設(shè)置隨機(jī)sleep時(shí)間,防止網(wǎng)站識(shí)別出你訪問時(shí)間太過均勻 - 可以設(shè)置代理IP,使用不斷變化的IP來請求,這樣就不會(huì)被判定為同一個(gè)人,請求非??煲矡o法被判定為爬蟲。大量抓取時(shí),如果不想以犧牲爬蟲速度為代價(jià)獲取數(shù)據(jù),一般都要設(shè)置代理IP。
要想獲得代理ip,主要有兩種途徑,一個(gè)是從免費(fèi)代理ip網(wǎng)站上獲得,另一個(gè)是購買付費(fèi)代理。
就我個(gè)人而言,平時(shí)要抓取的數(shù)據(jù)大都在千或者萬的級別,需要使用代理ip。但是爬蟲只運(yùn)行幾個(gè)小時(shí)也就能結(jié)束了,因此我會(huì)選擇按小時(shí)購買付費(fèi)代理IP。如果數(shù)據(jù)量再大,需要跑幾天幾個(gè)月這種的,使用付費(fèi)代理就比較貴了。
付費(fèi)代理IP比較穩(wěn)定,而且操作比較簡單。下文我們就分別講解付費(fèi)代理IP和免費(fèi)代理IP的設(shè)置。
requests代理IP設(shè)置
首先介紹一個(gè)網(wǎng)站
http://httpbin.org/ip
這是一個(gè)ip測試網(wǎng)站,你在瀏覽器打開這個(gè)網(wǎng)址,就可以看到你當(dāng)前使用的ip,比如我的就是
如果你用requests請求的話,得到的也是瀏覽器中顯示的內(nèi)容,表示你這次請求時(shí)的IP
>>> import requests>>> r = requests.get('http://httpbin.org/ip')>>> print(r.text){ "origin": "59.77.43.8"}
如果你設(shè)置了一個(gè)代理ip的話,它就會(huì)顯示你設(shè)置的ip,下面我們用requests實(shí)現(xiàn)代理IP設(shè)置
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),兩者都要有。
上面代碼讀者運(yùn)行多半會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)代理ip在我寫文章時(shí)有效,在讀者看文章時(shí)多半會(huì)失效了,帶著失效的ip訪問則拋出異常。
下面我們來簡單介紹從免費(fèi)代理網(wǎng)站上獲取代理ip。
免費(fèi)代理IP
免費(fèi)代理IP平臺(tái)非常多,比如西刺、3464網(wǎng)等,他們的樣子都是類似
其中代理ip地址和端口就是我們想要的值。我們可以從這里復(fù)制到我們上面的代碼中,看這個(gè)ip是否有效。測試之后發(fā)現(xiàn)這些免費(fèi)代理ip非常多是無效的(即攜帶它去requests會(huì)報(bào)錯(cuò))
如果我們真的要基于免費(fèi)代理IP進(jìn)行大規(guī)模爬蟲,不可能像上節(jié)那樣一個(gè)個(gè)指定,需要使用爬蟲不斷從免費(fèi)代理網(wǎng)站上抓取這些ip存到數(shù)據(jù)庫中,并經(jīng)常檢驗(yàn)它們是否有效,將無效ip剔除。然后每次請求都自動(dòng)從數(shù)據(jù)庫中提取IP,構(gòu)造
proxies
變量。這是代理ip池的維護(hù)問題,它的實(shí)現(xiàn)思路會(huì)在本文最后一節(jié)詳細(xì)說。
那么我們?nèi)绻幌胱约航ㄒ粋€(gè)代理IP池,就不能用這些免費(fèi)代理了嗎?
當(dāng)然不是。代理ip池也是有人造好了輪子,比如這個(gè)項(xiàng)目,可以看它的介紹,需要事先如何配置環(huán)境,然后就可以愉快地調(diào)用這些ip了。但是從免費(fèi)代理網(wǎng)站上獲得的IP質(zhì)量一般比較低,很難保證從IP池中提取的IP都是有效的。如果不想再折騰一些異常處理,或者改進(jìn)這個(gè)IP池,就選擇付費(fèi)IP吧。
除此之外,可以參考剛剛這個(gè)項(xiàng)目后面列出的同類項(xiàng)目
我們可以嘗試這些項(xiàng)目哪一個(gè)的效果最好。而且這些項(xiàng)目的源代碼也是學(xué)習(xí)構(gòu)建代理ip池的絕佳材料。
其中這個(gè)項(xiàng)目實(shí)現(xiàn)了用scrapy抓取各大免費(fèi)代理ip平臺(tái),如果不知道有哪些免費(fèi)代理網(wǎng)站,可以看這個(gè)項(xiàng)目寫了對哪些代理ip網(wǎng)站的爬蟲
在我們配置好代理IP之后,可以先多次訪問
https://httpbin.org/ip
這個(gè)網(wǎng)頁,看是否每一次都使用的是不同ip,然后再去抓取目標(biāo)網(wǎng)站。
付費(fèi)代理IP
我們上文說過,如果不是非常大規(guī)模的抓取,又不想折騰異常處理,最好選用付費(fèi)代理IP。
要想使用付費(fèi)代理IP,首先我們需要知道市面上有哪些平臺(tái)提供,哪個(gè)平臺(tái)比較好,以及各個(gè)平臺(tái)怎么用。
關(guān)于哪些平臺(tái)提供,和各個(gè)平臺(tái)的優(yōu)缺點(diǎn),已經(jīng)有大佬總結(jié)好了,看下面這篇文章
爬蟲代理哪家強(qiáng)?十大付費(fèi)代理詳細(xì)對比評測出爐!
這篇文章對站大爺、芝麻 HTTP 代理、太陽 HTTP 代理、訊代理、快代理、蘑菇代理、阿布云代理、全網(wǎng)代理、云代理、大象代理進(jìn)行了對比評測。
下面我以阿布云和芝麻代理為例講解付費(fèi)代理的使用。
1.阿布云
直接進(jìn)入官網(wǎng),選擇HTTP隧道,我一般使用的是動(dòng)態(tài)版,看下面一張圖
點(diǎn)擊價(jià)格方案,選定后(要登錄后) 立即購買,在里面對應(yīng)位置選購隧道即可,見下面這張圖
購買后可以看到這樣的界面
這里有通行證書和通行密鑰,需要在代碼中填入。下面我們來講一講如何在python中調(diào)用這個(gè)代理IP。
在最開始的界面中選擇接入指南,可以看到下面這個(gè)界面
這里說明了在各個(gè)軟件中如何使用阿布云,我們以python的requests庫為例來看一下(從下面這張圖中可以看到,scrapy等也都是支持的)
我們可以看到,將剛剛獲得的通行證書和通行密鑰放在
proxyUser
和
proxyPass
兩個(gè)變量中,最后構(gòu)造出一個(gè)proxies作為
requests.get
的參數(shù),帶著這個(gè)參數(shù)請求網(wǎng)頁即使用了代理IP。
使用阿布云時(shí)要注意(看阿布云的第一張圖),它限制了每秒只能請求5次,所以我們要限制自己的爬蟲速度,如果超過這個(gè)速度,要么購買更多次數(shù),要么降低抓取速度。
2.芝麻代理
在芝麻代理的獲取API選項(xiàng)中,可以先領(lǐng)取免費(fèi)IP來看看這是怎么用的,選好配置后點(diǎn)擊生成API鏈接,得到下圖
點(diǎn)擊打開鏈接可以看到
如果我們請求這個(gè)鏈接,可以得到上述內(nèi)容。
>>> 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(上面那個(gè)鏈接)的形式發(fā)給我們,我們需要自己去構(gòu)造proxies,用
requests.get(url, proxies = proxies)
進(jìn)行請求即可
構(gòu)造
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池創(chuàng)建思路
本節(jié)我們只是簡單敘述代理ip池實(shí)現(xiàn)的原理,細(xì)節(jié)部分我會(huì)推薦一些資料供想深入了解的讀者學(xué)習(xí)。
這里我們要搭建的代理ip池最好能像芝麻代理那樣,提供一個(gè)API(那個(gè)鏈接),當(dāng)請求這個(gè)API時(shí),就會(huì)返回一個(gè)代理ip。這樣獲取會(huì)比從數(shù)據(jù)庫中直接抽好。
下面給出一種ip代理池的實(shí)現(xiàn)思路
開啟三個(gè)進(jìn)程
- 爬蟲程序,從免費(fèi)代理網(wǎng)站上抓取ip,存儲(chǔ)到隊(duì)列中
- ip檢測程序,不斷對隊(duì)列中的ip進(jìn)行檢測,將無法使用的ip去除
- API接口服務(wù),便于IP調(diào)用
1.爬蟲程序
因?yàn)槊赓M(fèi)IP的可用性都比較低,所以需要用爬蟲抓取大量IP以備用。一般需要對多個(gè)免費(fèi)的代理IP網(wǎng)站分別寫一個(gè)請求、解析的函數(shù),然后同時(shí)運(yùn)行這些爬蟲程序,將抓取到的IP整合到一起,存到數(shù)據(jù)庫中,等待調(diào)用。一般數(shù)據(jù)庫選擇redis。
比如我們要抓取3個(gè)代理ip網(wǎng)站,可以先把3個(gè)爬蟲代碼跑一遍,將三個(gè)網(wǎng)站中所有ip都存到數(shù)據(jù)庫中,然后sleep一段時(shí)間。時(shí)間到時(shí)對數(shù)據(jù)庫中ip數(shù)量進(jìn)行判斷,如果數(shù)量依然很多,則不再抓取,再進(jìn)入sleep;如果ip已經(jīng)不夠了,則在執(zhí)行相同的爬蟲,雖然是抓取和之前相同的網(wǎng)站,但是代理ip網(wǎng)站都是時(shí)刻更新的,這一次訪問就會(huì)獲得很多上一次沒有得到的ip??傊褪歉粢欢螘r(shí)間將所有免費(fèi)ip網(wǎng)站全爬一遍。
這個(gè)思路用代碼呈現(xiàn)是這樣的
while True: if 數(shù)量 < 閾值: crawl time.sleep(100)
2.ip檢測程序
要新開一個(gè)進(jìn)程,和上面爬蟲進(jìn)程同時(shí)運(yùn)行,將數(shù)據(jù)庫中的ip提取出來檢驗(yàn)是否有效,將無效ip去除。檢驗(yàn)的方法是用這個(gè)ip去訪問一個(gè)網(wǎng)站,比如百度首頁,看是否返回200等請求成功的狀態(tài)碼,如果返回失敗的狀態(tài)碼,則要從數(shù)據(jù)庫中去除這個(gè)ip。因?yàn)閕p較多,檢驗(yàn)時(shí)可以使用異步等方式加快速度。也是設(shè)置sleep,隔一段時(shí)間檢測一次。
3.API接口服務(wù)
為了讓IP更容易調(diào)用,要設(shè)計(jì)出一個(gè)類似網(wǎng)頁的形式,請求一個(gè)URL就會(huì)獲得一個(gè)IP。可以基于Flask框架,非常簡單易上手。
下面推薦一些學(xué)習(xí)資源
對于基礎(chǔ)讀者,可以先看下面這篇文章
用Flask+Aiohttp+Redis維護(hù)動(dòng)態(tài)代理池
這篇文章詳細(xì)解釋了一個(gè)代理ip池是如何構(gòu)建起來的,有代碼,有解釋,非常適合初學(xué)者學(xué)習(xí)。
如果想對上面的ip池進(jìn)行改進(jìn),可以參考其他代理ip池的項(xiàng)目,比如這個(gè)項(xiàng)目,還有它后面列出的其他項(xiàng)目
專欄信息
專欄主頁:python編程
專欄目錄:目錄
爬蟲目錄:爬蟲系列目錄
版本說明:軟件及包版本說明