一、什么是 urllib 庫(kù)?
Python3 中將 Python2 中的 urllib 和 urllib2 兩個(gè)庫(kù)整合為一個(gè) urllib 庫(kù),所以現(xiàn)在一般說(shuō)的都是 Python3 中的 urllib 庫(kù),那么 urllib 庫(kù)是什么呢?如何使用 urllib 庫(kù)?urllib 庫(kù)的常用函數(shù)有哪些呢?
urllib主要分為以下四個(gè)功能模塊:
- urllib.request(請(qǐng)求模塊)
- urllib.parse(解析模塊)
- urllib.error(異常處理模塊)
- urllib.robotparser(robots.txt 文件解析模塊)
urllib 是 Python 內(nèi)置的 HTTP 請(qǐng)求庫(kù),無(wú)需安裝,可直接使用,也是爬蟲(chóng)開(kāi)發(fā)人員常用的一個(gè)庫(kù),今天小編就給大家總結(jié)一下 urllib 庫(kù)一些常用函數(shù)的基本用法。
二、urllib用法講解
1、urllib.request.urlopen() 函數(shù)
創(chuàng)建一個(gè)標(biāo)識(shí)遠(yuǎn)程 url 的文件對(duì)象,然后像本地文件一樣操作這個(gè)類(lèi)文件對(duì)象來(lái)獲取遠(yuǎn)程數(shù)據(jù)。語(yǔ)法如下:
urllib.request.urlopen(url,data = None,[timeout]*,cafile = None,capath = None,cadefault = False,context = None)
- url:請(qǐng)求的 url;
- data:請(qǐng)求的 data,如果設(shè)置了這個(gè)值,那么將變成 post 請(qǐng)求;
- timeout:設(shè)置網(wǎng)站的訪(fǎng)問(wèn)超時(shí)時(shí)間句柄對(duì)象;
- cafile和capath:用于 HTTPS 請(qǐng)求中,設(shè)置 CA 證書(shū)及其路徑。
示例
from urllib import request
response = request.urlopen('http://www.baidu.com') #get方式請(qǐng)求
print(response.read().decode('utf-8') #獲取響應(yīng)的內(nèi)容并進(jìn)行解碼操作
urlopen() 返回對(duì)象提供的方法有:
- read()、readline()、readlines()、fileno()、close():對(duì) HTTPR esponse 類(lèi)型數(shù)據(jù)進(jìn)行操作;
- info():返回 HTTPMessage 對(duì)象,表示遠(yuǎn)程服務(wù)器 返回的頭信息 ;
- getcode():返回 HTTP 狀態(tài)碼 geturl():返回請(qǐng)求的 url;
- getheaders():響應(yīng)的頭部信息 ;
- getheader('Server'):返回響應(yīng)頭指定參數(shù) Server 的值;
- status:返回狀態(tài)碼 ;
- reason:返回狀態(tài)的詳細(xì)信息 。
2、urllib.request.urlretrieve() 函數(shù)
這個(gè)函數(shù)可以方便的將網(wǎng)頁(yè)上的一個(gè)文件保存到本地。語(yǔ)法如下:
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
- url:遠(yuǎn)程數(shù)據(jù)的地址 ;
- filename:保存文件的路徑,如果為空,則下載為臨時(shí)文件 ;
- reporthook:鉤子函數(shù) 連接服務(wù)器成功以及每個(gè)數(shù)據(jù)塊下載完成時(shí)各調(diào)用一次,包含 3 個(gè)參數(shù),依次為已經(jīng)下載的數(shù)據(jù)塊,數(shù)據(jù)塊的大小,總文件的大小,可用于顯示下載進(jìn)度 ;
- data:post 到服務(wù)器的數(shù)據(jù)。
示例
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html') #將百度的首頁(yè)信息下載到本地
3、urllib.parse.urlencode() 函數(shù)
urlencode 可以把字典數(shù)據(jù)轉(zhuǎn)換為 URL 編碼的數(shù)據(jù)。語(yǔ)法如下:
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
- query:查詢(xún)參數(shù);
- doseq:序列元素是否單獨(dú)轉(zhuǎn)換;
- safe:安全默認(rèn)值;
- encoding:編碼;
- errors:錯(cuò)誤默認(rèn)值;
- quote_via:查詢(xún)參數(shù)的成份是str時(shí),safe, encoding, errors 傳遞給的指定函數(shù),默認(rèn)為 quote_plus(),加強(qiáng)版 quote()。
示例
from urllib import parse
data = {'姓名':'W3CSchool','問(wèn)好':'Hello W3CSchool','年齡':100}
qs = parse.urlencode(data)
print(qs)
# %E5%A7%93%E5%90%8D=W3CSchool&%E9%97%AE%E5%A5%BD=Hello+W3CSchool&%E5%B9%B4%E9%BE%84=100
4、urllib.parse.parse_qs() 函數(shù)
可以將經(jīng)過(guò)編碼后的 url 參數(shù)進(jìn)行解碼。語(yǔ)法如下:
urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
- keep_blank_values:當(dāng) value 為空時(shí),表示是否需要顯示 key,默認(rèn)為 False
- strict_parsing:指示如何處理解析錯(cuò)誤的標(biāo)志。如果為 False(默認(rèn)值),則會(huì)自動(dòng)忽略錯(cuò)誤。否則錯(cuò)誤會(huì)引發(fā) ValueError 異常。
示例
from urllib import parse
data = {'姓名':'W3CSchool','問(wèn)好':'hello W3CSchool','年齡':100}
qs = parse.urlencode(data)
print(qs)
#%E5%A7%93%E5%90%8D=W3CSchool&%E9%97%AE%E5%A5%BD=hello+W3CSchool&%E5%B9%B4%E9%BE%84=100
print(parse.parse_qs(qs))
#{'姓名': ['W3CSchool'], '問(wèn)好': ['hello W3CSchool'], '年齡': ['100']}
5、urllib.parse.parse_qsl() 函數(shù)
基本用法與 parse_qs() 函數(shù)一致,只是 urllib.parse.parse_qs() 函數(shù)返回字典,urllib.parse.parse_qsl() 函數(shù)放回列表。語(yǔ)法如下:
urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
示例
from urllib import parse
data = {'姓名':'W3CSchool','問(wèn)好':'hello W3CSchool','年齡':100}
qs = parse.urlencode(data)
print(parse.parse_qs(qs))
#[('姓名', 'W3CSchool'), ('問(wèn)好', 'hello W3CSchool'), ('年齡', '100')]
6、urllib.parse.urlparse() 和 urllib.parse.urlsplit() 函數(shù)
有時(shí)候拿到一個(gè) url,想要對(duì)這個(gè) url 中的各個(gè)組成部分進(jìn)行分割,那么這時(shí)候就可以使用 urlparse 或者是 urlsplit 來(lái)進(jìn)行分割。 各自語(yǔ)法如下:
urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
urllib.parse.urlsplit(urlstring, scheme=”, allow_fragments=True)
urlparse 和 urlsplit 基本上是一模一樣的。
唯一不一樣的地方是: urlparse 里有 params 屬性,而 urlsplit 沒(méi)有這個(gè) params 屬性。
示例
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
result = parse.urlparse(url)
# result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
print(result.params) # urlparse 里面有 params 屬性,而 urlsplit 沒(méi)有這個(gè)屬性。
7、urllib.error 模塊
urllib 的 error 模塊定義了由 urllib.request 請(qǐng)求產(chǎn)生的異常。如果請(qǐng)求失敗,urllib.request 便會(huì)拋出 error 模塊的異常。
- URLError
示例
from urllib import request, error
try:
resp = request.urlopen('https://w3cschool.c/index.html')
except error.URLError as e:
print(e.reason)
# [Errno 11001] getaddrinfo failed
- HTTPError
它是 URLError 的子類(lèi),專(zhuān)門(mén)用來(lái)處理 HTTP 請(qǐng)求錯(cuò)誤,具備以下三個(gè)屬性:
- code:返回HTTP狀態(tài)碼
- reason:異常原因
- headers:請(qǐng)求頭
示例
from urllib import request
response = request.urlopen('http://www.baidu.com') #get方式請(qǐng)求
print(response.read().decode('utf-8') #獲取響應(yīng)的內(nèi)容并進(jìn)行解碼操作
#404
當(dāng)然,大多時(shí)候都是將 URLError 和 HTTPError 結(jié)合才進(jìn)行異常處理,首先通過(guò) HTTPError 來(lái)捕獲 url 的錯(cuò)誤狀態(tài)碼、異常原因、請(qǐng)求頭等信息,如果不是該類(lèi)型錯(cuò)誤,再捕獲 URLError,輸出錯(cuò)誤原因,最后是 else 來(lái)處理正常的邏輯。
示例
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
resp = Request('http://www.baidu.cnc/')
try:
response = urlopen(resp)
except HTTPError as e:
print('(www.baidu.cnc)服務(wù)器無(wú)法完成請(qǐng)求。')
print('錯(cuò)誤代碼: ', e.code)
except URLError as e:
print('我們無(wú)法連接到服務(wù)器。')
print('原因: ', e.reason) else:
print("鏈接成功!")
print(response.read().decode("utf-8"))
以上就是 urllib 庫(kù)中常用的函數(shù),希望屏幕前的你多注重聯(lián)系,理論與實(shí)際相結(jié)合才是最好的學(xué)習(xí)方式!推薦閱讀:Python 靜態(tài)爬蟲(chóng)、Python Scrapy網(wǎng)絡(luò)爬蟲(chóng)。
最后,我們來(lái)總結(jié)一下常見(jiàn)的各種狀態(tài)碼含義:
- 200:請(qǐng)求正常,服務(wù)器正常的返回?cái)?shù)據(jù);
- 301:永久重定向。比如在訪(fǎng)問(wèn) www.jingdong.com 的時(shí)候會(huì)重定向到 www.jd.com;
- 302:臨時(shí)重定向。比如在訪(fǎng)問(wèn)一個(gè)需要登錄的頁(yè)面的時(shí)候,而此時(shí)沒(méi)有登錄,那么就會(huì)重定向到登錄頁(yè)面;
- 400:請(qǐng)求的url在服務(wù)器上找不到。換句話(huà)說(shuō)就是請(qǐng)求url錯(cuò)誤;
- 403:服務(wù)器拒絕訪(fǎng)問(wèn),權(quán)限不夠;
- 500:服務(wù)器內(nèi)部錯(cuò)誤??赡苁欠?wù)器出現(xiàn) bug 了。