python模塊(包)之urllib
urllib:官方文檔是最好的模塊表達(dá)說(shuō)明寺晌。
urllib is a package that collects several modules for working with URLs:
- urllib.request for opening and reading URLs
- urllib.error containing the exceptions raised by urllib.request
- urllib.parse for parsing URLs
- urllib.robotparser for parsing robots.txt files
大體來(lái)說(shuō)就是urllib是一個(gè)包含request弟断、error橡疼、parse矮固、robotparser四個(gè)模塊,關(guān)乎網(wǎng)絡(luò)資源請(qǐng)求的包洲敢。request模塊用來(lái)發(fā)起網(wǎng)絡(luò)資源請(qǐng)求败玉;error模塊用來(lái)在request網(wǎng)絡(luò)資源過(guò)程中搜集異常報(bào)錯(cuò);parse模塊用來(lái)對(duì)url地址進(jìn)行處理疫铜;robotparser模塊用來(lái)解析robots.txt文件(未知)茂浮。
1、request
The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.
1.1 方法
urllib.request.urlopen(url, data=None, [timeout, ], cafile=None, capath=None, cadefault=False, context=None):
- url,可以是url地址字符串席揽,或者是Request對(duì)象(下面會(huì)提到)顽馋。
- data,指定發(fā)送到服務(wù)器的數(shù)據(jù)對(duì)象幌羞。
- cafile寸谜、capath,發(fā)起HTTPS請(qǐng)求時(shí)指定一組可信的CA證書(shū)属桦。cafile應(yīng)指向包含一系列CA證書(shū)的單個(gè)文件熊痴,而capath應(yīng)指向散列證書(shū)文件的目錄。
- context聂宾,該參數(shù)若被指定果善,必須是
ssl.SSLContext
對(duì)象。 - timeout亏吝,請(qǐng)求超時(shí)時(shí)間岭埠。
這里一般url、data蔚鸥、timeout三個(gè)參數(shù)還比較常用惜论。
該函數(shù)返回一個(gè)上下文管理對(duì)象,包含一下幾種方法獲取返回結(jié)果的相關(guān)信息:
- geturl():返回檢索的資源的URL止喷,通常用于確定是否遵循重定向馆类。
- info():以
email.message_from_string()
實(shí)例的形式返回頁(yè)面的元信息,如頭信息弹谁。 - getcode():返回http響應(yīng)的狀態(tài)碼乾巧。
對(duì)于http和https,除上述的幾個(gè)函數(shù)獲取信息外预愤,該函數(shù)返回也是對(duì)http.client.HTTPResponse
稍加修改的對(duì)象沟于,其詳細(xì)說(shuō)明見(jiàn)下方官檔。
HTTPResponse Objects
這個(gè)對(duì)象常用方法有:
- read():讀取響應(yīng)主體植康,數(shù)據(jù)格式為bytes類(lèi)型旷太,需要decode()解碼,要按編碼轉(zhuǎn)換成str類(lèi)型销睁。
- msg:http.client.HTTPMessage包含響應(yīng)標(biāo)頭實(shí)例供璧。
- status:服務(wù)器的狀態(tài)碼。
- reason:服務(wù)器返回的原因短語(yǔ)冻记。
- closed:數(shù)據(jù)流被關(guān)閉時(shí)為T(mén)rue睡毒。
在查看urllib的源碼request.py
找到類(lèi)OpenerDirector
,其下面方法open
可以找到下面幾行代碼:
if isinstance(fullurl, str):
req = Request(fullurl, data)
else:
req = fullurl
if data is not None:
req.data = data
urllib.request.urlopen() 方面介紹里面提到:請(qǐng)求資源可以是url地址字符串冗栗,或者是Request對(duì)象演顾。再看上面一段代碼isinstance(fullurl, str)傳遞的fullurl是str的實(shí)例對(duì)象供搀,就將fullurl等轉(zhuǎn)化為Request的實(shí)例對(duì)象。
所以請(qǐng)求資源是url地址字符串或是Request對(duì)象都殊途同歸偶房,最終會(huì)轉(zhuǎn)為Request的實(shí)例對(duì)象進(jìn)行資源請(qǐng)求趁曼。下面的子類(lèi)會(huì)對(duì)Request對(duì)象進(jìn)行詳細(xì)介紹。
附加這個(gè)方法對(duì)應(yīng)的去注釋源碼棕洋。
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None):
global _opener
if cafile or capath or cadefault:
import warnings
warnings.warn("cafile, cpath and cadefault are deprecated, use a "
"custom context instead.", DeprecationWarning, 2)
if context is not None:
raise ValueError(
"You can't pass both context and any of cafile, capath, and "
"cadefault"
)
if not _have_ssl:
raise ValueError('SSL support not available')
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH,
cafile=cafile,
capath=capath)
https_handler = HTTPSHandler(context=context)
opener = build_opener(https_handler)
elif context:
https_handler = HTTPSHandler(context=context)
opener = build_opener(https_handler)
elif _opener is None:
_opener = opener = build_opener()
else:
opener = _opener
這里面注意幾個(gè)變量挡闰。
a、https_handler:姑且稱(chēng)為資源構(gòu)造器掰盘,它相當(dāng)于處理不同網(wǎng)絡(luò)資源的句柄對(duì)象摄悯,如HTTPHandler、HTTPSHandler愧捕、FileHandler奢驯、FTPHandler、UnknownHandler等類(lèi)的實(shí)例對(duì)象次绘。
b瘪阁、opener = build_opener(https_handler):姑且稱(chēng)為資源鑰匙,它是一個(gè)OpenerDirector
類(lèi)的實(shí)例對(duì)象邮偎,其參數(shù)是上面說(shuō)的資源構(gòu)造器管跺,用這把鑰匙可以打開(kāi)網(wǎng)絡(luò)的任意資源。
下面繼續(xù)request
模塊的方法介紹禾进。
urllib.request.build_opener([handler, ...]):構(gòu)造資源鑰匙豁跑,它是一個(gè)OpenerDirector
類(lèi)的實(shí)例對(duì)象,其參數(shù)是上面說(shuō)的資源構(gòu)造器泻云。
- handler艇拍,HTTPHandler、HTTPSHandler宠纯、FileHandler卸夕、FTPHandler、UnknownHandler等類(lèi)的實(shí)例對(duì)象婆瓜。
urllib.request.install_opener(opener):插入資源鑰匙快集,載入OpenerDirector
子類(lèi)的實(shí)例對(duì)象,用來(lái)請(qǐng)求網(wǎng)絡(luò)資源勃救。
- opener,常為build_opener([handler, ...])方法得到的
OpenerDirector
類(lèi)的實(shí)例對(duì)象治力。
1.2 request常用子類(lèi)
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None):網(wǎng)絡(luò)資源請(qǐng)求的抽象蒙秒。
- url,網(wǎng)絡(luò)資源地址字符串宵统。
- data晕讲, 請(qǐng)求攜帶數(shù)據(jù)覆获,常為post表單數(shù)據(jù)。
- headers瓢省,攜帶請(qǐng)求頭弄息,一些http常用請(qǐng)求頭信息。
- method勤婚,指明請(qǐng)求方法摹量,GET、POST馒胆、PUT之類(lèi)缨称。
urllib.request.HTTPCookieProcessor(cookiejar=None):處理http cookie。
- cookiejar祝迂,一般為
cookielib.CookieJar()
方法保存的cookie文件睦尽。
urllib.request.ProxyHandler(proxies=None):代理請(qǐng)求。
- proxies型雳,字典形式当凡。如
{'sock5': 'localhost:1080'}
、{'https': '192.168.8.8:2365'}
纠俭。
urllib.request.FileHandler():一個(gè)文件對(duì)象沿量。(不知是否可以作為上傳文件使用。)
這些子類(lèi)又有一些自己的方法柑晒,大多暫且不介紹欧瘪,附Request
類(lèi)的方法官檔鏈接。
2匙赞、error
處理由request請(qǐng)求產(chǎn)生的錯(cuò)誤佛掖。
urllib.error.URLError:地址錯(cuò)誤,有屬性如下:
- reason涌庭,可能是錯(cuò)誤字符串或其它的錯(cuò)誤實(shí)例芥被。
urllib.error.HTTPError:網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤,有屬性如下:
- code坐榆,http狀態(tài)碼拴魄。
- reason,錯(cuò)誤原因席镀。
- headers匹中,響應(yīng)頭。
3豪诲、parse
The urllib.parse module defines functions that fall into two broad categories: URL parsing and URL quoting. These are covered in detail in the following sections.
這個(gè)模塊提供處理url的標(biāo)準(zhǔn)接口顶捷,兩種:解析處理和引用處理。
3.1 URL Parsing
The URL parsing functions focus on splitting a URL string into its components, or on combining URL components into a URL string.
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True):url地址解析屎篱。
url地址通常標(biāo)準(zhǔn)格式如下:scheme://netloc/path;parameters?query#fragment
詳細(xì)說(shuō)明介紹可見(jiàn)http.md
的介紹服赎。返回是6個(gè)元素組成的元組葵蒂。
- urlstring,urlstring地址字符串重虑。
- scheme践付,指定默認(rèn)協(xié)議。
- allow_fragments缺厉,F(xiàn)alse時(shí)將不進(jìn)行fragment解析永高,直接將其視作path、query或parameters的一部分芽死。
urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'):解析url參數(shù)字符串乏梁。
- qs,查詢(xún)子串关贵。
- keep_blank_values遇骑,百分比編碼查詢(xún)的空白值是否應(yīng)視為空白字符串。
- strict_parsing揖曾,如果解析錯(cuò)誤落萎,false為默認(rèn)忽略,否則錯(cuò)誤引發(fā)ValueError異常炭剪。
- encoding练链,errors∨梗可選的編碼和錯(cuò)誤參數(shù)指定如何將百分比編碼的序列解碼為Unicode字符媒鼓。
3.2 URL Quoting
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus):多參數(shù)元組拼接為百分比編碼后的字符串。
4错妖、寫(xiě)在后面
概念比較空洞绿鸣,實(shí)踐出真知。簡(jiǎn)單內(nèi)容可以參見(jiàn)threading_douban.py
暂氯。