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證書(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 官檔

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)的方法官檔鏈接。

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暂氯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潮模,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痴施,更是在濱河造成了極大的恐慌擎厢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辣吃,死亡現(xiàn)場(chǎng)離奇詭異动遭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)神得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)厘惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人循头,你說(shuō)我怎么就攤上這事绵估。” “怎么了卡骂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵国裳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我全跨,道長(zhǎng)缝左,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任浓若,我火速辦了婚禮渺杉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挪钓。我一直安慰自己是越,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布碌上。 她就那樣靜靜地躺著倚评,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馏予。 梳的紋絲不亂的頭發(fā)上天梧,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音霞丧,去河邊找鬼呢岗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛹尝,可吹牛的內(nèi)容都是我干的后豫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼箩言,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼硬贯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起陨收,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饭豹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后务漩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拄衰,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年饵骨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘悉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡居触,死狀恐怖妖混,靈堂內(nèi)的尸體忽然破棺而出老赤,到底是詐尸還是另有隱情,我是刑警寧澤制市,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布抬旺,位于F島的核電站,受9級(jí)特大地震影響祥楣,放射性物質(zhì)發(fā)生泄漏开财。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一误褪、第九天 我趴在偏房一處隱蔽的房頂上張望责鳍。 院中可真熱鬧,春花似錦兽间、人聲如沸历葛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)啃洋。三九已至,卻和暖如春屎鳍,著一層夾襖步出監(jiān)牢的瞬間宏娄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工逮壁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孵坚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓窥淆,卻偏偏與公主長(zhǎng)得像卖宠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忧饭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

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