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