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)