python之web模塊學習-- urllib2

  下面繼續學習python的web模塊 ---  urllib2,一個源於urllib又高於urllib的模塊。html


1  urllib2 簡介python

    urllib2是python自帶的一個訪問網頁及本地文件的庫。web

    與urllib相比,顯著區別之處在於:瀏覽器

    1) urllib2能夠接受一個Request類的實例來設置URL請求的headers,urllib僅能夠接受URL。這意味着,用urllib時不能夠假裝User Agent字符串等。服務器

    2) urllib提供urlencode方法用來encode發送的data,而urllib2沒有。這是爲什麼urllib常和urllib2一塊兒使用的緣由。網絡


2  urllib2 經常使用方法app

 2.1  urllib2.urlopenide

    urlopen()是最簡單的請求方式,它打開url並返回類文件對象,而且使用該對象能夠讀取返回的內容post

    urllib2.urlopen(url[, data][, timeout]) 
參數:
    url: 能夠是包含url的字符串,也能夠是urllib2.request類的實例。
    data: 是通過編碼的post數據(通常使用urllib.urlencode()來編碼)。
    沒有data參數時爲GET請求,設置data參數時爲POST請求
    timeout: 是可選的超時期(以秒爲單位),設置請求阻塞的超時時間,若是沒有設置的話,會使用全局默認timeout參數,該參數只對HTTP、HTTPS、FTP生效

假設urlopen()返回的文件對象u,它支持下面的這些經常使用的方法:學習

  • u.read([nbytes]) 以字節字符串形式讀取nbytes個數據

  • u.readline() 以字節字符串形式讀取單行文本

  • u.readlines() 讀取全部輸入行而後返回一個列表

  • u.close() 關閉連接

  • u.getcode() 返回整數形式的HTTP響應代碼,好比成功返回200,未找到文件時返回404

  • u.geturl() 返回所返回的數據的實際url,可是會考慮發生的重定向問題

  • u.info() 返回映射對象,該對象帶有與url關聯的信息,對HTTP來講,返回的服務器響應包含HTTP包頭。對於FTP來講,返回的報頭包含'content-length'。對於本地文件,返回的報頭包含‘content-length’和'content-type'字段。

注意:

    類文件對象u以二進制模式操做。若是須要以文本形式處理響應數據,則須要使用codecs模塊或相似方式解碼數據。

附代碼:

>>> import urllib2
>>> res=urllib2.urlopen('http://www.51cto.com')
>>>res.read()
。。。。。。(一堆源代碼)
>>>res.readline()
'<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n'
>>>res.readlines()
。。。(list形式的一堆源碼)
>>>res.info()
<httplib.HTTPMessage instance at0x1a02638>
>>>res.getcode()
200
>>>res.geturl()
'http://www.51cto.com'
#最後關閉鏈接
>>> res.close()

  2.2  urllib2.request

     新建Request實例

    Request (url [data,headers[,origin_req_host ,[unverifiable]]]])
說明:
    對於比較簡單的請求,urlopen()的參數url就是一個表明url的,但若是須要執行更復雜的操做,如修改HTTP報頭,能夠建立Request實例並將其做爲url參數
參數:
    url: 爲url字符串,
    data: 是伴隨url提交的數據(好比要post的數據)。不過要注意,提供data參數時,它會將HTTP請求從'GET'改成‘POST’。
    headers: 是一個字典,包含了可表示HTTP報頭的鍵值映射(即要提交的header中包含的內容)。
    origin_req_host: 一般是發出請求的主機的名稱,若是請求的是沒法驗證的url(一般是指不是用戶直接輸入的url,好比加載圖像的頁面中鑲入的url),則後一個參數unverifiable設爲TRUE

    假設Request實例r,其比較重要的方法有下面幾個:

  • r.add_data(data) 向請求添加數據。若是請求是HTTP請求,則方法改成‘POST’。data是向指定url提交的數據,要注意該方法不會將data追教導以前已經設置的任何數據上,而是使用如今的data替換以前的。

  • r.add_header(key, val) 向請求添加header信息,key是報頭名,val是報頭值,兩個參數都是字符串。

  • r.addunredirectedheader(key,val) 做用基本同上,但不會添加到重定向請求中。

  • r.set_proxy(host, type) 準備請求到服務器。使用host替換原來的主機,使用type替換原來的請求類型。

附代碼:

    1  向網頁提交數據:

>>> import urllib
>>> import urllib2
>>> url='http://www.51cto.com'
>>> info={'name':"51cto",'location':'51cto'}
#info須要被編碼爲urllib2能理解的格式,這裏用到的是urllib
>>> data=urllib.urlencode(info)
>>> data
'name=51cto&location=51cto'
>>> request=urllib2.Request(url,data)
>>> response=urllib2.urlopen(request)
>>> the_page=response.read()

    2  修改網頁頭信息:

    有時會碰到,程序也對,可是服務器拒絕你的訪問。這是爲何呢?問題出在請求中的頭信息(header)。 有的服務端有潔癖,不喜歡程序來觸摸它。這個時候你須要將你的程序假裝成瀏覽器來發出請求。請求的方式就包含在header中。


    在使用 REST 接口時,Server 會檢查Content-Type字段,用來肯定 HTTP Body 中的內容該怎樣解析。


>>> import urllib
>>> import urllib2
>>> url='http://www.51cto.com'
# 將user_agent寫入頭信息
>>> user_agent='Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)'
>>>values={'name':'51cto','location':"51cto",'language':'Python'} 
>>> headers={'User-Agent':user_agent}
>>> data=urllib.urlencode(values)
>>> req=urllib2.Request(url,data,headers)
>>> response=urllib2.urlopen(req)
>>> the_page=response.read()

  2.3  異常處理

    不能處理一個respons時,urlopen拋出一個urlerror


urllib2.URLError:  
urllib2.HTTPError:

    HTTPerror是HTTP URL在特別的狀況下被拋出的URLError的一個子類。


    urlerror:
    一般,urlerror被拋出是由於沒有網絡 鏈接(沒有至特定服務器的鏈接)或者特定的服務器不存在。在這種狀況下,含有reason屬性的異常將被拋出,以一種包含錯誤代碼 和文本錯誤信息的tuple形式。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
#多寫了一個 m (comm)
req = urllib2.Request('http://www.51cto.comm')
try:
    urllib2.urlopen(req)
except urllib2.URLError,e:
    print e
    print e.reason

結果:


<urlopen error [Errno 11004] getaddrinfo failed>
[Errno 11004] getaddrinfo failed


    以上是 urllib2的簡單用法,若是要深刻:

http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html

    urllib和urllib2之間的區別:

http://www.cnblogs.com/yuxc/archive/2011/08/01/2124073.html

相關文章
相關標籤/搜索