網絡爬蟲01: Urllib2庫使用代理IP

    今天將時間幾乎花在了爬蟲的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()
相關文章
相關標籤/搜索