好多網站都有反爬措施,例如很多網站會檢測某一段時間某一個IP的訪問次數太過於頻繁,就有可能會禁止這個IP的訪問。當然面對這種情況可定也有相應的措施,我們只要隔一段時間換一個IP就可以了。因此我們就需要一些代理伺服器,每隔一段時間換一個代理,就算IP被禁止,依然可以換個IP繼續爬。

在python中,可以使用urllib2中的ProxyHandler來設定使用代理伺服器,下面通過程式碼說明如何來使用代理:

這裡寫圖片描述

# coding=utf-8
import urllib2

#構建了兩個代理Handler,一個代理IP,一個沒有代理IP

httpproxy_handler = urllib2.ProxyHandler({"http":"124.88.67.81:80"})
nullproxy_handler = urllib2.ProxyHandler({})

#定義一個代理開關

proxySwitch = False
# 通過urllib2.build_opener()方法使用這些代理Hanlder物件,建立自定義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()

遇到問題:
當定義一個代理開關

proxySwitch = True 用代理時候執行報錯;urllib2.URLError: <urlopen error [Errno 10060] >提示連線失敗。

為了分析這一問題的原因,擼主採用瞭如下過程:
1、在瀏覽器裡輸入,可以正常開啟,說明該站點是可以訪問的。
2、同樣的指令碼放在公司的體驗網上執行OK,說明指令碼本身沒有問題。

那就說明這個代理ip不能用所以導致這問題,選擇不用ip代理proxySwitch = False;順利爬到程式碼;

上面使用的是免費的開放代理,我們可以在一些代理網站上收集這些免費代理,測試後如果可以用,就把它收集起來用在爬蟲上面。

免費代理網站:

西刺免費代理

快代理免費代理

全國代理ip

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

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()

上面使用的都是免費代理,不是很穩定,很多時候會出現無法使用的情況,這時候可以考慮使用私密代理。也就是向代理供應商購買代理,供應商會提供一個有效代理,並且有自己的使用者名稱和密碼,具體使用和免費代理一樣,這是多了一個賬戶認證,如下:

# 構建具有一個私密代理IP的Handler,其中user為賬戶,passwd為密碼
httpproxy_handler = urllib2.ProxyHandler({"http" : "user:[email protected]:80"})

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

使用免費代理:

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:[email protected]:16816" }

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

print response.text

這樣看起來簡單不少。

注:可以將賬戶密碼寫入環境變數以免洩露

.