urllib 代理設(shè)置
我們?cè)谧雠老x的過(guò)程中經(jīng)常會(huì)遇到這樣的情況,最初爬蟲正常運(yùn)行,正常抓取數(shù)據(jù),一切看起來(lái)都是那么美好,然而一杯茶的功夫可能就會(huì)出現(xiàn)錯(cuò)誤,比如403 Forbidden,這時(shí)候打開網(wǎng)頁(yè)一看,可能會(huì)看到“您的IP訪問(wèn)頻率太高”這樣的提示。出現(xiàn)這種現(xiàn)象的原因是網(wǎng)站采取了一些反爬蟲措施。比如,服務(wù)器會(huì)檢測(cè)某個(gè)IP在單位時(shí)間內(nèi)的請(qǐng)求次數(shù),如果超過(guò)了這個(gè)閾值,就會(huì)直接拒絕服務(wù),返回一些錯(cuò)誤信息,這種情況可以稱為封IP。
既然服務(wù)器檢測(cè)的是某個(gè)IP單位時(shí)間的請(qǐng)求次數(shù),那么借助某種方式來(lái)偽裝我們的IP,讓服務(wù)器識(shí)別不出是由我們本機(jī)發(fā)起的請(qǐng)求,不就可以成功防止封IP了嗎?
一種有效的方式就是使用代理,后面會(huì)詳細(xì)說(shuō)明代理的用法。在這之前,需要先了解下代理的基本原理,它是怎樣實(shí)現(xiàn)IP偽裝的呢?
基本原理: 代理實(shí)際上指的就是代理服務(wù)器,英文叫作proxy server,它的功能是代理網(wǎng)絡(luò)用戶去取得網(wǎng)絡(luò)信息。形象地說(shuō),它是網(wǎng)絡(luò)信息的中轉(zhuǎn)站。在我們正常請(qǐng)求一個(gè)網(wǎng)站時(shí),其實(shí)是發(fā)送了請(qǐng)求給Web服務(wù)器,Web服務(wù)器把響應(yīng)傳回給我們。如果設(shè)置了代理服務(wù)器,實(shí)際上就是在本機(jī)和服務(wù)器之間搭建了一個(gè)橋,此時(shí)本機(jī)不是直接向Web服務(wù)器發(fā)起請(qǐng)求,而是向代理服務(wù)器發(fā)出請(qǐng)求,請(qǐng)求會(huì)發(fā)送給代理服務(wù)器,然后由代理服務(wù)器再發(fā)送給Web服務(wù)器,接著由代理服務(wù)器再把Web服務(wù)器返回的響應(yīng)轉(zhuǎn)發(fā)給本機(jī)。這樣我們同樣可以正常訪問(wèn)網(wǎng)頁(yè),但這個(gè)過(guò)程中Web服務(wù)器識(shí)別出的真實(shí)IP就不再是我們本機(jī)的IP了,就成功實(shí)現(xiàn)了IP偽裝,這就是代理的基本原理
代理的作用:
突破自身IP訪問(wèn)限制,訪問(wèn)一些平時(shí)不能訪問(wèn)的站點(diǎn)。
訪問(wèn)一些單位或團(tuán)體內(nèi)部資源:比如使用教育網(wǎng)內(nèi)地址段免費(fèi)代理服務(wù)器,就可以用于對(duì)教育網(wǎng)開放的各類FTP下載上傳,以及各類資料查詢共享等服務(wù)。
提高訪問(wèn)速度:通常代理服務(wù)器都設(shè)置一個(gè)較大的硬盤緩沖區(qū),當(dāng)有外界的信息通過(guò)時(shí),同時(shí)也將其保存到緩沖區(qū)中,當(dāng)其他用戶再訪問(wèn)相同的信息時(shí),則直接由緩沖區(qū)中取出信息,傳給用戶,以提高訪問(wèn)速度。
隱藏真實(shí)IP:上網(wǎng)者也可以通過(guò)這種方法隱藏自己的IP,免受攻擊。對(duì)于爬蟲來(lái)說(shuō),我們用代理就是為了隱藏自身IP,防止自身的IP被封鎖。
使用代理IP,這是爬蟲/反爬蟲的第二大招,對(duì)于爬蟲來(lái)說(shuō),由于爬蟲爬取速度過(guò)快,在爬取過(guò)程中可能遇到同一個(gè)IP訪問(wèn)過(guò)于頻繁的問(wèn)題,此時(shí)網(wǎng)站就會(huì)讓我們輸入驗(yàn)證碼登錄或者直接封鎖IP,這樣會(huì)給爬取帶來(lái)極大的不便。通常這種反爬蟲手段也是最好用的。
很多網(wǎng)站會(huì)檢測(cè)某一段時(shí)間某個(gè)IP的訪問(wèn)次數(shù)(通過(guò)流量統(tǒng)計(jì),系統(tǒng)日志等),如果訪問(wèn)次數(shù)多的不像正常人,它會(huì)禁止這個(gè)IP的訪問(wèn)。
所以我們可以設(shè)置一些代理服務(wù)器,每隔一段時(shí)間換一個(gè)代理,就算IP被禁止,依然可以換個(gè)IP繼續(xù)爬取
常見(jiàn)的代理分類:
1.根據(jù)協(xié)議劃分:
FTP代理服務(wù)器:主要用于訪問(wèn)FTP服務(wù)器,一般有上傳、下載的功能以及緩存的功能,端口號(hào)一般為21,2121等。
HTTP代理服務(wù)器:主要用于訪問(wèn)網(wǎng)頁(yè),一般有內(nèi)容過(guò)濾和緩存的功能,端口號(hào)一般為80、8080、3128等
SSL/TLS代理:主要能用于訪問(wèn)加密的網(wǎng)站,一般有SSL或者TLS加密功能
SOCKS代理:只是單純的用于傳輸數(shù)據(jù)包,不關(guān)心具體的協(xié)議用法,速度快、有緩存功能,端口號(hào)一般為1080
2.根據(jù)匿名內(nèi)容劃分:
高度匿名代理:會(huì)將數(shù)據(jù)包原封不動(dòng)的轉(zhuǎn)發(fā),在服務(wù)器看來(lái)就好像真的是一個(gè)普通的用戶短在訪問(wèn),而記錄的IP就是代理服務(wù)器的IP
普通匿名代理:會(huì)在數(shù)據(jù)包上做一些改動(dòng),服務(wù)端上有可能發(fā)現(xiàn)這個(gè)是代理服務(wù)器,也有一定的幾率追查到客戶端的真實(shí)IP.
透明代理:不但改動(dòng)了數(shù)據(jù)包,還會(huì)告訴服務(wù)器客戶端的真實(shí)IP,這種代理除了用緩存技術(shù)提高瀏覽器速度。能用內(nèi)容過(guò)濾提高安全性之外,并沒(méi)有其他作用。
使用代理IP 這是爬蟲/反爬蟲的第二大招,通常也是最好用的。
很多網(wǎng)站會(huì)檢測(cè)某一段時(shí)間某個(gè)IP的訪問(wèn)次數(shù)(通過(guò)流量統(tǒng)計(jì),系統(tǒng)日志等),如果訪問(wèn)次數(shù)多的不像正常人,它會(huì)禁止這個(gè)IP的訪問(wèn)。
所以我們可以設(shè)置一些代理服務(wù)器,每隔一段時(shí)間換一個(gè)代理,就算IP被禁止,依然可以換個(gè)IP繼續(xù)爬取
ProxyHandler處理器用來(lái)設(shè)置代理
urllib.request中通過(guò)ProxyHandler來(lái)設(shè)置使用代理服務(wù)器,下面代碼說(shuō)明如何使用自定義opener來(lái)使用代理:
from urllib import request,error
#構(gòu)建支持代理的handler
proxy = {
'http':'61.138.33.20:808',
'https':'120.69.82.110:44693',
}
proxy_handler = request.ProxyHandler(
proxies=proxy
)
# 構(gòu)建一個(gè)私密代理Handler,需要加上私密代理賬戶的用戶名和密碼
# authproxy = {
# "http" :"username:password@61.135.217.7:80"
#}
# authproxy_handler=urllib.request.ProxyHandler(
# proxies=authproxy
#)
#根據(jù)proxy_handler實(shí)例化一個(gè)opener對(duì)象
opener = request.build_opener(proxy_handler)
url = 'http://www.baidu.com/'
# 使用https://httpbin.org/get接口驗(yàn)證使用了代理
# url = 'https://httpbin.org/get'
try:
response = opener.open(url,timeout=5)
print(response.status)
except error.HTTPError as err:
print(err.reason)
except error.URLError as err:
print(err.reason)
# 1. 如果按照上面代碼,只有使用opener.open()方法發(fā)送
請(qǐng)求才使用自定義的代理,而urlopen()則不使用自定義代理。
response = opener.open(request)
# 2. 將自定義的opener設(shè)置為全局的opener,之后所有的,不管是
opener.open()還是urlopen() 發(fā)送請(qǐng)求,都將使用自定義代理。
# request.install_opener(opener)
# response = urlopen(request)