python [3.2] urllib的使用

urllib是python的一個獲取url(Uniform Resource Locators,統一資源定址器)的模塊。它用urlopen函數的形式提供了一個非常簡潔的接口。這使得用各種各樣的協議獲取url成爲可能。它同時 也提供了一個稍微複雜的接口來處理常見的狀況-如基本的認證,cookies,代理,等等。這些都是由叫做opener和handler的對象來處理的。

一:基本使用方法+異常處理

from urllib.error import URLError,HTTPError
import urllib.request
import urllib.parse
url='http://www.baidu.com/s'
values={'wd':'python',
        'opt-webpage':'on',
        'ie':'gbk'}
url_values=urllib.parse.urlencode(values)
#print(url_values)

url_values=url_values.encode(encoding='UTF8')
full_url=urllib.request.Request(url,url_values)
#or ony one sentense:full_url=url+'?'+url_values

try:
    response=urllib.request.urlopen(full_url)   #open=urlopen
except HTTPError as e:
    print('Error code:',e.code) 
except URLError as e:
    print('Reason',e.reason)
the_page=response.read()
print(the_page)


調用urlopen函數對請求的url返回一個response對象。這個response是一個file-like的對象,這意味着你能用.read()函數操作這個response對象

注意:urllib.request.Request(url,data) data參數是要進行任意編碼(utf8...)的,否則會報POST data should be bytes or an iterable of bytes. It cannot be str.錯誤.

           或者用url+'?'+url_values來合成full_url ,只用一條語句,代碼更簡潔


二:add headers to HTTP request

user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
....
headers={'User-Agent':user_agent}
....
full_url=urllib.request.Request(url,url_values,headers)


三:Openers 和Handlers


當你獲取一個URL時,你使用一個opener(一個可能以一個比較迷糊名字命名的實例–urllib2.OpenerDirector)。正常情況下
我們一直使用默認的opener,但你也可以創建自定義的openers。opener使用操作器(handlers)。所有的重活都交給這些handlers來做。
每一個handler知道以哪種url協議(http,ftp等等)打開url,或者怎麼處理打開url時的某些方面,如,HTTP重定向,或者HTTP cookie。
你將會創建openers如果你想要用安裝特別的handlers獲取url,例如,獲取一個處理cookie的opener,或者一個不處理重定向的opener。

默認opener有對普通情況的操作器 (handlers)- ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

創建Openers:
枚舉一個OpenerDirector,然後多次調用.add_handler(some_handler_instance)來創建一個opener。

或用build_opener,這是一個很方便的創建opener對象的函數,它只有一個函數調用。build_opener默認會加入許多handlers

import urllib.request
proxy_support = urllib.request.ProxyHandler({})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)




發佈了31 篇原創文章 · 獲贊 5 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章