urllib庫簡單的介紹

參考資料:廖雪峰的Python教程蒿讥,崔慶才的博客

urllib是Python內(nèi)建的一個(gè)http請求庫囚聚,主要分為urllib.request / urllib.error / urllib.parse / urllib.robotparser四個(gè)模塊。
下面來分別做簡單的介紹。

1.urllib.request

用來模擬瀏覽器發(fā)送請求。

1.1 urlopen

語法:

urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)

用這個(gè)方法來訪問百度御吞,并打印返回:

import urllib.request
response = urllib.request.urlopen('http://www.baidu.com') 
print(response.read().decode('utf-8')) #這里的read方法獲取了response的內(nèi)容,并轉(zhuǎn)換格式

在編輯器或者IDE(推薦pycharm)中執(zhí)行代碼漓藕,就會(huì)看到返回結(jié)果:

返回結(jié)果的一部分截圖.png

接下來試著發(fā)送一個(gè)POST請求:

from urllib import request, parse

data = bytes(urllib.parse.urlencode({'world': 'hi'}),encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(response.read().decode('utf-8'))

返回結(jié)果如下魄藕,從圖片中可以看到我們設(shè)置的數(shù)據(jù)data已經(jīng)成功傳遞。


數(shù)據(jù)已經(jīng)傳輸成功.png

第三個(gè)參數(shù)timeout可以設(shè)置請求的時(shí)長:

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)  # 這里設(shè)置超時(shí)時(shí)間為0.1撵术,如果時(shí)間超過0.1,則拋出錯(cuò)誤
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):  # 對(duì)錯(cuò)誤類型進(jìn)行判斷话瞧,如果是socket.timeout,則打印 TIME OUT
        print('TIME OUT')  # TIME OUT

1.1.1 關(guān)于response

打印一下response:

import urllib.request
import urllib.error

response = urllib.request.urlopen('http://httpbin.org/get')
print(type(response))
print(response.status)  # 獲取狀態(tài)碼
print(response.getheaders())  # 獲取響應(yīng)頭嫩与,是一個(gè)數(shù)組
print(response.getheader('Server'))  #注意這里是 getheader 不是 getheaders;獲取響應(yīng)頭中的某個(gè)值交排,如獲取Server
response截圖.png

1.1.2 設(shè)置request

手動(dòng)設(shè)置request的請求頭等參數(shù):

from urllib import request, parse
url = 'http://httpbin.org/post'
headers = {  # 請求頭
    'User-Agent': 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
    'Host': 'httpbin.org'
}
dict = {
    'name': 'wg'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST') # 這樣結(jié)構(gòu)很鮮明
response = request.urlopen(req)
print(response.read().decode('utf-8'))

可以看到返回的數(shù)據(jù)和之前是一致的:

返回的數(shù)據(jù)和之前是一致的.png

2. urllib.error

用來處理程序運(yùn)行中的異常划滋。大致分為HTTPError / URLError:

# 異常處理模塊
from urllib import request, error

try:
    response = request.urlopen('http://www.onebookman.com/index.html')  # 請求一個(gè)并不存在的地址
except error.HTTPError as e:
    print(e.reason, e.headers, e.code, 'wrong', sep='\n')
except error.URLError as e:
    print(e.reason)
except error.ContentTooShortError as e:
    print(e.content)
else:
    print('request suc')

3. urllib.urlparse

解析URL。
看一段代碼就能明白它的用途:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result)

輸出結(jié)果為:

<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

3.1 urlunparse

這個(gè)方法是urlparse的反操作:

from urllib.parse import urlunparse
data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
print(urlunparse(data))

輸出結(jié)果:

http://www.baidu.com/index.html;user?a=6#comment

3.2 urlencode

把一個(gè)字典對(duì)象拼接為get請求的參數(shù):

from urllib.parse import urlencode

params = {
    'name': 'wg',
    'age': 18
}
base_url = 'http://www.baidu.com'
url = base_url + urlencode(params)
print(url)  # http://www.baidu.comname=wg&age=18

4. urllib.robotparser

robotparser為robots.txt文件實(shí)現(xiàn)了一個(gè)解釋器埃篓,可以用來讀取robots文本的格式和內(nèi)容处坪,用函數(shù)方法檢查給定的User-Agent是否可以訪問相應(yīng)的網(wǎng)站資源。如果要編寫一個(gè)網(wǎng)絡(luò)蜘蛛,這個(gè)模塊可以限制一些蜘蛛抓取無用的或者重復(fù)的信息同窘,避免蜘蛛掉入動(dòng)態(tài)asp/php網(wǎng)頁程序的死循環(huán)中玄帕。


以上就是對(duì)urllib庫的簡單介紹。
完想邦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裤纹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丧没,更是在濱河造成了極大的恐慌鹰椒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呕童,死亡現(xiàn)場離奇詭異漆际,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夺饲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門奸汇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钞支,你說我怎么就攤上這事茫蛹。” “怎么了烁挟?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵婴洼,是天一觀的道長。 經(jīng)常有香客問我撼嗓,道長柬采,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任且警,我火速辦了婚禮粉捻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斑芜。我一直安慰自己肩刃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布杏头。 她就那樣靜靜地躺著盈包,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醇王。 梳的紋絲不亂的頭發(fā)上呢燥,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音寓娩,去河邊找鬼叛氨。 笑死呼渣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寞埠。 我是一名探鬼主播屁置,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼畸裳!你這毒婦竟也來了缰犁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤怖糊,失蹤者是張志新(化名)和其女友劉穎帅容,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伍伤,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡并徘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扰魂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麦乞。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劝评,靈堂內(nèi)的尸體忽然破棺而出姐直,到底是詐尸還是另有隱情,我是刑警寧澤蒋畜,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布声畏,位于F島的核電站,受9級(jí)特大地震影響姻成,放射性物質(zhì)發(fā)生泄漏插龄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一科展、第九天 我趴在偏房一處隱蔽的房頂上張望均牢。 院中可真熱鬧,春花似錦才睹、人聲如沸徘跪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽真椿。三九已至,卻和暖如春乎澄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背测摔。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工置济, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留解恰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓浙于,卻偏偏與公主長得像护盈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羞酗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361