urllib和urllib2的區別和使用
Python的urllib和urllib2模組都做與請求URL相關的操作,但他們提供不同的功能。他們兩個最顯著的差異如下:
urllib2可以接受一個Request物件,並以此可以來設定一個URL的headers,但是urllib只接收一個URL。這意味著,你不能偽裝你的使用者代理字串等。
urllib模組可以提供進行urlencode的方法,該方法用於GET查詢字串的生成,urllib2的不具有這樣的功能。這就是urllib與urllib2經常在一起使用的原因。
常用方法和類
- urllib2.urlopen(url[, data][, timeout])
url引數可以是一個字串url,也可以是一個Request物件。
對於可選的引數timeout,阻塞操作以秒為單位,如嘗試連線(如果沒有指定,將使用設定的全域性預設timeout值)。實際上這僅適用於HTTP,HTTPS和FTP連線。
timeout引數在urlopen中傳入。
Timeout 設定
urlopen 方法第三個引數就是 timeout 的設定,可以設定等待多久超時,為了解決一些網站實在響應過慢而造成的影響。
例如下面的程式碼,如果第二個引數 data 為空那麼要特別指定是 timeout 是多少,寫明形參,如果data已經傳入,則不必宣告。
import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)
import urllib2
response = urllib2.urlopen('http://www.baidu.com',data, 10)
- urllib2.Request類
class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
URL——是一個字串,其中包含一個有效的URL。
data——是一個字串,指定額外的資料傳送到伺服器,如果沒有data需要傳送可以為“None”。目前使用data的HTTP請求是唯一的。當請求含有data引數時,HTTP的請求為POST,而不是GET。資料應該是快取在一個標準的application/x-www-form-urlencoded格式中。urllib.urlencode()函式用對映或2元組,返回一個這種格式的字串
import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
'location' : 'Northampton',
'language' : 'Python' }#values字典
data = urllib.urlencode(values)#urrllib.urlencode()函式用對映或二元組,返回標準格式的字串
req = urllib2.Request(url, data)#傳入data
response = urllib2.urlopen(req)
the_page = response.read()
headers——是字典型別,頭字典可以作為引數在request時直接傳入,也可以把每個鍵和值作為引數呼叫add_header()方法來新增。
import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael Foord',
'location' : 'Northampton',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }##偽裝主機的headers
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)#headers傳入Request類
response = urllib2.urlopen(req)
the_page = response.read()
origin_req_host——是RFC2965定義的源互動的request-host。預設的取值是cookielib.request_host(self)。這是由使用者發起的原始請求的主機名或IP地址。例如,如果請求的是一個HTML文件中的影象,這應該是包含該影象的頁面請求的request-host。
unverifiable ——代表請求是否是無法驗證的,它也是由RFC2965定義的。預設值為false。一個無法驗證的請求是,其使用者的URL沒有足夠的許可權來被接受。例如,如果請求的是在HTML文件中的影象,但是使用者沒有自動抓取影象的許可權,unverifiable的值就應該是true。