Python爬蟲實例(三)代理的使用

一些網站會有相應的反爬蟲措施,例如不少網站會檢測某一段時間某個IP的訪問次數,若是訪問頻率太快以致於看起來不像正常訪客,它可能就會會禁止這個IP的訪問。因此咱們須要設置一些代理服務器,每隔一段時間換一個代理,就算IP被禁止,依然能夠換個IP繼續爬取。

在Python中,可使用urllib2中的ProxyHandler來設置使用代理服務器,下面經過代碼說明如何來使用代理:html

 

import urllib2

# 構建了兩個代理Handler,一個有代理IP,一個沒有代理IP
httpproxy_handler = urllib2.ProxyHandler({"http" : "124.88.67.81:80"})
nullproxy_handler = urllib2.ProxyHandler({})
#定義一個代理開關
proxySwitch = True 
# 經過 urllib2.build_opener()方法使用這些代理Handler對象,建立自定義opener對象
# 根據代理開關是否打開,使用不一樣的代理模式
if proxySwitch:  
    opener = urllib2.build_opener(httpproxy_handler)
else:
    opener = urllib2.build_opener(nullproxy_handler)

request = urllib2.Request("http://www.baidu.com/")

# 使用opener.open()方法發送請求才使用自定義的代理,而urlopen()則不使用自定義代理。
response = opener.open(request)

# 就是將opener應用到全局,以後全部的,無論是opener.open()仍是urlopen() 發送請求,都將使用自定義代理。
# urllib2.install_opener(opener)
# response = urlopen(request)

print response.read()

 

上面使用的是免費的開放代理,咱們能夠在一些代理網站上收集這些免費代理,測試後若是能夠用,就把它收集起來用在爬蟲上面。服務器

免費代理網站:dom

西刺免費代理測試

快代理免費代理網站

全國代理ipui

若是你有足夠多的代理,能夠放在一個列表中,隨機選擇一個代理去訪問網站。以下:url

import urllib2
import random

proxy_list = [
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"},
    {"http" : "124.88.67.81:80"}
]

# 隨機選擇一個代理
proxy = random.choice(proxy_list)
# 使用選擇的代理構建代理處理器對象
httpproxy_handler = urllib2.ProxyHandler(proxy)

opener = urllib2.build_opener(httpproxy_handler)

request = urllib2.Request("http://www.baidu.com/")
response = opener.open(request)
print response.read()

上面使用的都是免費代理,不是很穩定,不少時候會出現沒法使用的狀況,這時候能夠考慮使用私密代理。也就是向代理供應商購買代理,供應商會提供一個有效代理,而且有本身的用戶名和密碼,具體使用和免費代理同樣,這是多了一個帳戶認證,以下:spa

# 構建具備一個私密代理IP的Handler,其中user爲帳戶,passwd爲密碼
httpproxy_handler = urllib2.ProxyHandler({"http" : "user:passwd@124.88.67.81:80"})

上面就是使用urllib2設置代理的方法,不過看起來有些麻煩,下面咱們看看如何使用reqursts來使用代理。代理

使用免費代理:code

import requests

# 根據協議類型,選擇不一樣的代理
proxies = {
  "http": "http://12.34.56.79:9527",
  "https": "http://12.34.56.79:9527",
}

response = requests.get("http://www.baidu.com", proxies = proxies)
print response.text

使用私密代理:

import requests

# 若是代理須要使用HTTP Basic Auth,可使用下面這種格式:
proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" }

response = requests.get("http://www.baidu.com", proxies = proxy)

print response.text

這樣看起來簡單很多。

注:能夠將帳戶密碼寫入環境變量以避免泄露

相關文章
相關標籤/搜索