根據上一篇博文User Agent已經設置好了,但是還應該考慮一個問題,程序的運行速度是很快的,如果我們利用一個爬蟲程序在網站爬取東西,一個固定IP的訪問頻率就會很高,這不符合人爲操作的標準,因爲人操作不可能在幾ms內,進行如此頻繁的訪問。所以一些網站會設置一個IP訪問頻率的閾值,如果一個IP訪問頻率超過這個閾值,說明這個不是人在訪問,而是一個爬蟲程序。
一個很簡單的解決辦法就是設置延時,但是這顯然不符合爬蟲快速爬取信息的目的,所以另一種更好的方法就是使用IP代理。
ProxyHandler處理(代理服務器)
- 使用代理IP,是爬蟲的常用手段
- 獲取代理服務器的地址:(注意:當然也可以寫個正則表達式從網站直接爬取IP,但是要記住不要太頻繁爬取,加個延時什麼的,太頻繁給服務器帶來壓力了,服務器會直接把你block,不讓你訪問的。編寫代碼訪http://www.whatismyip.com.tw/,該網站是測試自己IP爲多少的網址,服務器會返回訪問者的IP)
- www.xicidaili.com
- www.goubanjia.com
- 代理用來隱藏真實訪問中,代理也不允許頻繁訪問某一個固定網站,所以,代理一定要很多很多
- 基本使用步驟:
- 設置代理地址
- 創建ProxyHandler:調用urlib.request.ProxyHandler(),proxies參數爲一個字典
- 創建Opener:opener = request.build_opener(proxy_handler)
- 安裝Opener:request.install_opener(opener)
使用install_opener方法之後,會將程序默認的urlopen方法替換掉。也就是說,如果使用install_opener之後,在該文件中,再次調用urlopen會使用自己創建好的opener。如果不想替換掉,只是想臨時使用一下,可以使用opener.open(url),這樣就不會對程序默認的urlopen有影響。
- 案例1
案例1:
'''
使用代理訪問百度網站
'''
from urllib import request, error
if __name__ == '__main__':
url = "http://www.baidu.com"
# 使用代理步驟
# 1. 設置代理地址
proxy = {'http': '120.194.18.90:81' }
# 2. 創建ProxyHandler
proxy_handler = request.ProxyHandler(proxy)
# 3. 創建Opener
opener = request.build_opener(proxy_handler)
# 4. 安裝Opener
request.install_opener(opener)
# 現在如果訪問url,則使用代理服務器
try:
rsp = request.urlopen(url)
html = rsp.read().decode()
print(html)
except error.URLError as e:
print(e)
except Exception as e:
print(e)