今天將時間幾乎花在了爬蟲的Handler處理器和代理設置上,聽說如今的反爬蟲機制會發現爬蟲程序,而後封掉爬蟲程序請求的IP地址。這就糟糕了,因此仍是要好好學習一下IP的代理設置,學完以後就可使用代理來訪問目標網址,能夠避免封掉我IP了。還真是問題不愁找不到解決的人啊,我給你們推薦一些免費短時間的代理網址:python
先寫一個基本的HTTPHandler處理器,這是沒有使用代理的狀況,是使用真實IP訪問的post
#!/usr/bin/env python # coding=utf-8 import urllib2 # 構建一個HTTPHandler處理器對象,支持處理HTTP的請求 #http_handler = urllib2.HTTPHandler() # 在HTTPHandler增長參數"debuglevel=1"將會自動自動打開Debug log模式 # 程序在打印的時候就會顯示此時接收和發送包的信息 http_handler = urllib2.HTTPHandler(debuglevel=1) # 調用build_opener()方法構建一個自定義的opener對象,參數是構建的處理器對象 opener = urllib2.build_opener(http_handler) request = urllib2.Request("http://www.baidu.com/") # 主要是將urllib2.urlopen改爲了自定義的opener對象,使用方法open response = opener.open(request) print response.read()
這段代碼中,須要總結的就是真實IP訪問建立的是HTTPHandler,使用的方法也是urllib2的HTTPHandler方法,這個方法能夠跟一個參數,debuglevel=1,功能是網絡調試,它會返回在屏幕上接收和發送包的信息。建立好一個處理器對象後,就不能使用urllib2.urlopen方法打開一個網址了,而是要自定義一個opener,用opener.open來訪問目標網址。建立方法是使用urllib2包下的build_opener來建立一個opener對象,參數是以前建立好的處理器對象,也就是http_handler,而後就可使用opener.open來請求了學習
若是是想使用代理IP的話,建立處理器的方法就不是urllib2.HTTPHandler了,而是經過urllib2.ProxyHandler來建立一個IP代理處理器對象,代碼以下:測試
#!/usr/bin/env python # coding=utf-8 import urllib2 import random # 啓用代理開關,可判斷後面是否須要使用代理 proxyswitch = True # 建立一個代理處理器對象,參數是一個字典類型,包含了代理類型和代理服務器IP+端口號 httpproxy_handler = urllib2.ProxyHandler({"http": "119.188.162.165:8081"}) # 建立一個沒有代理的處理器對象,注意沒有代理不表明沒有參數,而要填寫一個{} nullproxy_handler = urllib2.ProxyHandler({}) if proxyswitch: opener = urllib2.build_opener(httpproxy_handler) else: opener = urllib2.build_opener(nullproxy_handler) # 建立了一個全局的opener,以後均可以使用urlopen()方式去發送,也附帶Handler的功能 urllib2.install_opener(opener) request = urllib2.Request("http://www.baidu.com/") response = urllib2.urlopen(request) print response.read()
與第一個不是代理訪問的區別是,ProxyHTTPHandler必須加上IP和端口,參數是一個字典形式,以http做鍵,IP:端口爲鍵值,如 {"http": "119.188.162.165:8081"},並且要注意的是,若是在ProxyHTTPHandler處理器方法下不想使用代理IP也要必須加上{},也就是說這個參數必須帶,能夠爲空。另外以前沒有使用建立處理器時是可使用urllib2.urlopen方法打開網址的,可是使用了處理器就沒法直接使用該方法,須要作的步驟就是在代碼層面上裝一個opener,這個能夠用urllib.install_opener實現,參數就是建立好的opener,且無返回值ui
固然了,若是本身測試過的可用代理IP夠多的話,也能夠像隨機得到User-Agent同樣,能夠隨機選擇一個IP訪問,這樣就更不容易被發現這是一個爬蟲程序了,能夠假裝的更好url
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)
固然還有一種代理叫作私密代理,免費的代理由於使用的人多,不是很穩定,極可能上一秒還在正常訪問,下一秒就出現了沒法訪問的故障。因此又出現了一種叫作私密代理的代理,這種代理須要用戶名和密碼,具體代碼實現以下:debug
#!/usr/bin/env python # coding=utf-8 import urllib2 authproxy_handler = urllib2.ProxyHandler({"host": "用戶名:密碼@IP:端口"}) opener = urllib2.build_opener(authproxy_handler) request = urllib2.Request("http://www.baidu.com/") response = opener.open(request) print response.read()