爬蟲和反爬蟲的對抗并不激烈。今天我們主要討論一個非常重要的對付反爬蟲的手段,那就是IP代理。
通常,我們會訪問如下網(wǎng)址:
動態(tài)IP模擬器
當(dāng)客戶端向URL所在的服務(wù)器發(fā)起請求時,會攜帶自己的IP地址,這樣服務(wù)器就可以獲得我們的IP地址。當(dāng)這個IP地址在某段時間內(nèi)過于頻繁地發(fā)起請求時,它可能會在某段時間內(nèi)限制其訪問。
在編寫爬蟲程序的過程中,為了防止這種情況發(fā)生,有必要使用IP代理。IP代理的原理如下:
第一步:我們將向代理服務(wù)器發(fā)送請求,并告訴代理服務(wù)器我們想要訪問https://www.zhihu.com。
第二步:代理服務(wù)器將代替我們向https://www.zhihu.com發(fā)送請求。
第三步:服務(wù)器收到代理服務(wù)器的請求后,將數(shù)據(jù)返回給代理服務(wù)器。
第四步:代理服務(wù)器收到服務(wù)器返回的數(shù)據(jù)后,將數(shù)據(jù)發(fā)送給客戶端。
這樣,通過代理服務(wù)器向網(wǎng)址所在的服務(wù)器發(fā)送請求,我們就可以完美地隱藏自己的IP,這樣我們的IP就不會被限制訪問。
不過,肯定會有代價的。我們需要通過IP代理轉(zhuǎn)發(fā)我們想要的數(shù)據(jù),這自然會導(dǎo)致爬行速度變慢。只有使用原生IP發(fā)起請求是最快的。
接下來,像往常一樣,我們使用代碼來演示如何通過IP代理發(fā)起請求:
導(dǎo)入請求
#自由代理可以從https://www.xicidaili.com/,獲得,但自由ip代理的存活率很低。
代理= { 0
http:“”183 . 148 . 158 . 64:9999
}
RES = requests . get(' https://www . Baidu . com ',proxies = proxy)
打印(參考文本)
#如果可以正確返回結(jié)果,那么當(dāng)前的ip代理是活動的、可用的,否則當(dāng)前的ip代理無效。
僅有一個代理ip是不夠的。我們應(yīng)該維護(hù)自己的ip代理池。當(dāng)ip代理失敗時,它將被消除。那么如何維護(hù)一個可用的ip代理池呢?
#第一步:通過https://www.xicidaili.com/wt/.獲取ip_list
導(dǎo)入請求
來自bs4導(dǎo)入美麗組
隨機(jī)導(dǎo)入
def get_ip_list(url):
標(biāo)題= { 0
用戶代理“:”Mozilla/5.0(Windows NT 10.0;WOW64)applebwebkit/537.36(KHTML,像Gecko)Chrome/66 . 0 . 3359 . 139 Safari/537.36’
}
res = requests.get(url,headers = headers)
res =美化組(res.text,' html.parser ')
結(jié)果= RES . select(# IP _ list tr)
對于結(jié)果[1:]中的結(jié)果:
ip = result.select('td')[1]。文本
port = result.select('td')[2]。文本
法官(ip,端口)
#獲取ip后,無法直接保存。首先,你應(yīng)該判斷它是否可用。
#第二步:確定獲取的ip是否有效。
ip_list = []
def判斷(ip、端口):
代理= { ' http ':IP+':'+端口}
嘗試:
RES = requests . get(' https://www . Baidu . com ',proxies = proxy)
例外:
打印(此IP:“+IP+”無效)
返回False
否則:
if 200