urllib

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證書。cafile應(yīng)指向包含一系列CA證書的單個(gè)文件,而capath應(yīng)指向散列證書文件的目錄。
  • 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 官檔

HTTPResponse Objects這個(gè)對(duì)象常用方法有:

  • read():讀取響應(yīng)主體,數(shù)據(jù)格式為bytes類型,需要decode()解碼,要按編碼轉(zhuǎn)換成str類型。
  • msg:http.client.HTTPMessage包含響應(yīng)標(biāo)頭實(shí)例。
  • status:服務(wù)器的狀態(tài)碼。
  • reason:服務(wù)器返回的原因短語(yǔ)。
  • closed:數(shù)據(jù)流被關(guān)閉時(shí)為True。

在查看urllib的源碼request.py找到類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)求。下面的子類會(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:姑且稱為資源構(gòu)造器,它相當(dāng)于處理不同網(wǎng)絡(luò)資源的句柄對(duì)象,如HTTPHandler、HTTPSHandler、FileHandler、FTPHandler、UnknownHandler等類的實(shí)例對(duì)象。

b、opener = build_opener(https_handler):姑且稱為資源鑰匙,它是一個(gè)OpenerDirector類的實(shí)例對(duì)象,其參數(shù)是上面說(shuō)的資源構(gòu)造器,用這把鑰匙可以打開(kāi)網(wǎng)絡(luò)的任意資源。

下面繼續(xù)request模塊的方法介紹。

urllib.request.build_opener([handler, ...]):構(gòu)造資源鑰匙,它是一個(gè)OpenerDirector類的實(shí)例對(duì)象,其參數(shù)是上面說(shuō)的資源構(gòu)造器。

  • handler,HTTPHandler、HTTPSHandler、FileHandler、FTPHandler、UnknownHandler等類的實(shí)例對(duì)象。

urllib.request.install_opener(opener):插入資源鑰匙,載入OpenerDirector子類的實(shí)例對(duì)象,用來(lái)請(qǐng)求網(wǎng)絡(luò)資源。

  • opener,常為build_opener([handler, ...])方法得到的OpenerDirector類的實(shí)例對(duì)象。

1.2 request常用子類

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之類。

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ì)象。(不知是否可以作為上傳文件使用。)

這些子類又有一些自己的方法,大多暫且不介紹,附Request類的方法官檔鏈接。

Request類的方法官檔

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,查詢子串。
  • keep_blank_values,百分比編碼查詢的空白值是否應(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、寫在后面

概念比較空洞,實(shí)踐出真知。簡(jiǎn)單內(nèi)容可以參見(jiàn)threading_douban.py

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,540評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,028評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,801評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,223評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,442評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,800評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,996評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,233評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,926評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,702評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • Python爬蟲(chóng)入門(urllib+Beautifulsoup) 本文包括:1、爬蟲(chóng)簡(jiǎn)單介紹2、爬蟲(chóng)架構(gòu)三大模塊3...
    廖少少閱讀 9,887評(píng)論 0 6
  • urllib.request urllib.request模塊定義函數(shù)和類用來(lái)打開(kāi)URLs urllib.requ...
    低吟淺唱1990閱讀 337評(píng)論 0 0
  • urllib庫(kù) python內(nèi)置的HTTP請(qǐng)求庫(kù) 四個(gè)模塊:request,parse,error,rebotpa...
    我是一只菜鳥(niǎo)呀閱讀 3,058評(píng)論 0 2
  • 在學(xué)校呆了一周,論文答辯搞定,自己所有的東西也都收拾的差不多了,該丟的丟,該寄回去的寄回去,能帶的自己帶上飛機(jī),除...
    Miss桃桃閱讀 149評(píng)論 0 0
  • 近來(lái)忙于招新相關(guān)事宜以及各種考試之類,再加上各種雜七雜八,作業(yè)來(lái)不及做,書來(lái)不及讀,圖書館也不去,甚于睡覺(jué)也不夠。...
    璆余生閱讀 316評(píng)論 0 0