urllib2使用總結

urllib2是Python的一個獲取URLs的組件。他以urlopen函數的形式提供了一個非常簡單的接口,具有利用不同協議獲取URLs的能力,同樣提供了一個比較複雜的接口來處理一般情況。

    urllib2支持獲取不同格式的URLs例如:ftp、Gopher等,並利用它們相關網絡協議進行獲取。

    urllib2可用來完成以下功能:

    1.獲取Web頁面

    2.在遠程http服務器上驗證
    3.額外數據請求,如表單提交(GET和POST)
    4.異常處理
    5.非http協議通信(如FTP)

1.獲取Web頁面

    例1:打印html頁面,下面是最簡單的形式 

  1. #!/usr/bin/env python
  2. import urllib2 
  3. response = urllib2.urlopen('http://www.google.com') 
  4. html = response.read()
  5. print html
    例2:打開指定頁面並打印html頁面和一些額外的信息,採用了urllib2最一般的形式:iurllib2.Request()的功能是構造一個請求信息,返回的req就是一個構造好的請求。ii、urllib2.urlopen()的功能是發送剛剛構造好的請求req,並返回一個文件類的對象response,包括了所有的返回信息。iii通過response.read()可以讀取到response裏面的html,通過response.info()可以讀到一些額外的信息

  1. #!/usr/bin/env python
  2. import sys, urllib2

  3. req = urllib2.Request(sys.argv[1])
  4. response = urllib2.urlopen(req)
  5. print "Retrieved", response.geturl()

  6. info = response.info()
  7. for key, value in info.items():
  8.     print "%s = %s" % (key, value)

  9. html = response.read()
  10. print html


2.在遠程http服務器上驗證

    有些站點需要http認證後才能訪問。最普通的認證類型是基本認證,由客戶端向服務器器發送一個用戶名和密碼。http認證一般顯示一個彈出窗口來詢問用戶名和密碼,這與基於cookie和form的認證不同。

    下面是一個例子,首先定義了一個擴展urllib2.HTTPPasswordMgr的類,允許在需要的時候詢問用戶名和密碼,然後調用build_opener()指定一些額外處理,其實在urllib2.urlopen()內部調用了build_opener(),並且不帶任何參數。所以在訪問常規網站的時候urllib2.urlopen()等於opener.open()返回都一樣。

  1. #!/usr/bin/env python
  2. import sys, urllib2, getpass

  3. class BasePassword(urllib2.HTTPPasswordMgr):
  4.     def find_user_password(self, realm, authurl):
  5.         ret = urllib2.HTTPPasswordMgr.find_user_password(self, realm, authuri)

  6.         if ret[0] == None and ret[1] == None:
  7.             sys.stdout.write("Login reauired for %s at %sn" % (realm, authurl))
  8.             sys.stdout.write("Username: ")
  9.             username = sys.stdin.readline().rstrip()
  10.             password = getpass.getpass().rstrip()
  11.             return (username, password)
  12.         else:
  13.             return ret

  14. req = urllib2.Request(sys.argv[1])
  15. opener = urllib2.build_opener(urllib2.HTTPBasicAuthHandler(BasePassword()))

  16. response = opener.open(req)
  17. print response.read()

3.表單提交(GET和POST)

    有兩種方法提交表單數據:GET和POST,取決於HTML文檔中

標籤裏面的參數

    GET實例:

  1. #!/usr/bin/env python
  2. import sys, urllib2, urllib

  3. keyword = sys.argv[1]
  4. url = url + '?' + urllib.urlencode('http://www.xxx.com', [('query', keyword)])

  5. req = urllib2.Request(url)
  6. response = urllib2.urlopen(req)

  7. print response.read()

    POST實例:

  1. #!/usr/bin/env python
  2. import sys, urllib2, urllib

  3. keyword = sys.argv[1]
  4. url = 'http://www.xxx.com'
  5. data = urllib.urlencode([('query', keyword)])
  6. req = urllib2.Request(url)
  7. response = urllib2.urlopen(req, data)

    更一般的提交數據,通過urllib2.Request()構造一個有額外數據的請求信息。包括“http header”和想要發送的數據,這些數據需要被以標準的方式encode,然後作爲一個數據參數傳送給Request對象。Encoding是在urllib中完成的,而不是在urllib2中完成的。

    如下例:

  1. #!/usr/bin/env python
  2. import urllib, urllib2

  3. url = 'http://www.baidu.com'
  4. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
  5. values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python' }
  6. headers = { 'User-Agent' : user_agent }
  7. data = urllib.urlencode(values)
  8. req = urllib2.Request(url, data, headers)
  9. response = urllib2.urlopen(req)
  10. the_page = response.read()

4.異常處理

    捕獲連接錯誤,在和遠程Web服務器建立連接時,很多地方可能出現問題:提供的URL不對、URL使用了一個不支持的協議、主機名不存在、訪問不到服務器或者服務器針對請求返回一個錯誤(例如:404)。

    任何在連接過程中產生的異常要麼是urllib2.URLError的實例,要麼是它的一個子類。

  1. #!/usr/bin/env python
  2. import sys, urllib2

  3. req = urllib2.Request(sys.argv[1])

  4. try:
  5.     response = urllib2.urlopen(req)
  6. except urllib2.URLError, e:
  7.     print "Error retrieving data:", e
  8.     sys.exit(1)

  9. print response.read()

5.非http協議通信(如FTP)

    urllib2模塊也支持非http協議。默認情況下支持http、ftp、gopher和機器本地硬盤上的文件,只是response.info()返回的報頭會有所差異。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章