python3 中使用urllib問題以及urllib詳解
今天遇到一個(gè)蠻奇怪的問題:當(dāng)我在控制臺(tái)中使用 urllib 沒問題,但是當(dāng)我在 vscode 中 .py 文件中導(dǎo)入 urllib 使用時(shí)會(huì)報(bào)錯(cuò):
AttributeError: module 'urllib' has no attribute 'request'
查了一下資料是 python3 的 urllib 不會(huì)自動(dòng)導(dǎo)入其under層的包,需要手動(dòng)導(dǎo)入。
import urllib import urllib.parse import urllib.request
再次使用即可成功。
urllibe 是 python3 中將中文 urlencode 編碼使用的函數(shù),urlencode 使用如下:
import urllib import urllib.parse urllib.parse.quote(string, safe='/', encoding=None, errors=None)
urllib 將編碼后的字符串轉(zhuǎn)為中文則使用:
import urllib import urllib.parse urllib.parse.unquote(string, encoding='utf-8', errors='replace')
聊到這里就順帶講講 urllibe 的使用吧
urllib 是一個(gè) python 內(nèi)置包,不需要額外安裝即可使用,它包含一下幾個(gè)用來處理 url 的模版。
- urllib.request,用來打開和讀取 url,意思就是可以用它來模擬發(fā)送請(qǐng)求,就像在瀏覽器里輸入網(wǎng)址然后敲擊回車一樣,獲取網(wǎng)頁響應(yīng)內(nèi)容。
- urllib.error,用來處理 urllib.request 引起的異常,保證程序的正常執(zhí)行。
- urllib.parse,用來解析 url,可以對(duì) url 進(jìn)行拆分、合并等。
- urllib.robotparse,用來解析 robots.txt 文件,判斷網(wǎng)站是否能夠進(jìn)行爬取。
urllib.request 模塊
urllib.request 模塊定義了以下幾個(gè)函數(shù)。
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
該函數(shù)主要用于模擬網(wǎng)站請(qǐng)求,返回一個(gè) HTTPResponse 類型的對(duì)象。
urlopen 函數(shù)中參數(shù)定義
- url,必選參數(shù),是一個(gè) str 字符串或者 Request 對(duì)象(后面會(huì)介紹)。
- data,bytes 類型的可選參數(shù),如果傳遞的是字典型數(shù)據(jù),可以用 urllib.parse.urlencode() 進(jìn)行編碼,返回 str 字符串,再將 str 轉(zhuǎn)換成 bytes 字節(jié)流。如果傳遞 data 參數(shù),urlopen 將使用 HTTP POST 方式請(qǐng)求,否則為 HTTP GET 請(qǐng)求。
- timeout,可選參數(shù),設(shè)置超時(shí)時(shí)間(未設(shè)置時(shí)使用全局默認(rèn)超時(shí)時(shí)間),以秒為單位計(jì)時(shí),如果 urlopen 請(qǐng)求超出了設(shè)置時(shí)間還未得到響應(yīng)則拋出異常。
- cafile 和 capath,可選參數(shù),在 HTTPS 連接請(qǐng)求時(shí)指定已認(rèn)證的 CA 證書以及證書路徑。
- cadefault,一般可忽略該參數(shù)。
- context,ssl.SSLContext 類型的可選參數(shù),用來指定 SSL 設(shè)置。
urlopen 函數(shù)返回類型
urlopen 函數(shù)請(qǐng)求返回一個(gè) HTTPResponse 響應(yīng)上下文,或者請(qǐng)求異常拋出 URLError 協(xié)議錯(cuò)誤,一般有如下屬性:
- geturl(),返回檢索的 url,通常用于判定是否進(jìn)行了重定向。
- info(),返回網(wǎng)頁的頭信息。
- getcode(),返回 HTTPResponse 響應(yīng)的狀態(tài)碼。
urlopen 函數(shù)的應(yīng)用實(shí)例
# 創(chuàng)建一個(gè) HTTP GET 請(qǐng)求,輸出響應(yīng)上下文 from urllib.request import urlopen response = urlopen("http://www.python.org") print(response.read()) # 創(chuàng)建一個(gè) HTTP POST 請(qǐng)求,輸出響應(yīng)上下文 from urllib.request import urlopen from urllib.parse import urlencode data = {'kw' : 'python'} data = bytes(urlencode(data), encoding = 'utf-8') response = urlopen("https://fanyi.baidu.com/sug", data) print(response.read().decode('unicode_escape'))
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
該函數(shù)主要用于構(gòu)造一個(gè) url,返回一個(gè) urllib.request.Request 對(duì)象。
Request 函數(shù)中參數(shù)定義
- url,必選參數(shù),請(qǐng)求的 url 地址。
- data,bytes 類型的可選參數(shù)。
- headers,字典類型,有些 HTTP 服務(wù)器僅允許來自瀏覽器的請(qǐng)求,因此通過 headers 來模擬瀏覽器對(duì) url 的訪問,比如模擬谷歌瀏覽器時(shí)使用的 headers:”Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36”。可以通過調(diào)用 add_header() 來添加 headers 信息。
- origin_req_host,請(qǐng)求方的 host 名稱或者 IP 地址。
- unverifiable,表示這個(gè)請(qǐng)求是否無法驗(yàn)證,默認(rèn)為 False。比如請(qǐng)求一張圖片,如果沒有權(quán)限獲取圖片那它的值就是 true。
- method,是一個(gè)字符串,用來指示請(qǐng)求使用的方法,如:GET,POST,PUT 等,默認(rèn)是 GET 請(qǐng)求。
Request 函數(shù)返回類型
與 urlopen 函數(shù)請(qǐng)求返回一樣,一般返回一個(gè) HTTPResponse 響應(yīng)上下文。
Request 函數(shù)的應(yīng)用實(shí)例
# 采用 HTTP GET 請(qǐng)求的方法模擬谷歌瀏覽器訪問網(wǎng)站,輸出響應(yīng)上下文 from urllib import request,parse url = 'http://www.python.org' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } req = request.Request(url, headers = headers, method = 'GET') response = request.urlopen(req) print(response.read())
2 urllib.error 模塊
urllib.error 模塊定義了由 urllib.request 模塊引發(fā)的異常,異常主要包含 URLError 和 HTTPError。
urllib.error.URLError 異常
URLError 類繼承自 OSError 類,是 error 異常模塊的基類,由request模塊產(chǎn)生的異常都可以通過捕獲這個(gè)類來處理。URLError 只有一個(gè)屬性 reason,即返回錯(cuò)誤的原因。
應(yīng)用實(shí)例:
# 在請(qǐng)求連接時(shí)候捕獲網(wǎng)址錯(cuò)誤引發(fā)的異常 from urllib import request, error try: response = request.urlopen('https://www,baidu,com') except error.URLError as e: print(e.reason)
urllib.error.HTTPError 異常
HTTPError 是 URLError 的子類,專門用來處理 HTTP 請(qǐng)求錯(cuò)誤,比如認(rèn)證請(qǐng)求失敗,包含以下三個(gè)屬性:
- code:返回 HTTP 響應(yīng)的狀態(tài)碼,如404頁面不存在等。
- reason:返回錯(cuò)誤的原因。
- headers:返回 HTTP 響應(yīng)頭信息。
應(yīng)用舉例:
# 返回401未授權(quán)錯(cuò)誤 from urllib import request,error try: response=request.urlopen('http://pythonscraping.com/pages/auth/login.php') print(response.getcode()) except error.HTTPError as e: print('1.錯(cuò)誤原因:\n%s\n2.狀態(tài)碼:\n%s\n3.響應(yīng)頭信息:\n%s' %(e.reason, e.code, e.headers)) except error.URLError as e: print(e.reason)
urllib.parse 模塊
urllib.parse 模塊定義了一個(gè)處理 url 的標(biāo)準(zhǔn)接口,用來實(shí)現(xiàn) url 字符串的抽取、合并以及鏈接轉(zhuǎn)換。該模塊主要用到的函數(shù)如下。
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
用于實(shí)現(xiàn) url 字符串的識(shí)別和分段,可以分為六個(gè)字符串,分別是 scheme (協(xié)議),netloc (域名),path (路徑),params (參數(shù)),query (查詢條件)和 fragment (錨點(diǎn)),其結(jié)構(gòu)如下所示:“scheme://netloc/path;parameters?query#fragment”。實(shí)際上具體 url 某些字段可能會(huì)不存在,比如 “http://www.baidu.com” 只包含了協(xié)議和域名。
urlparse 函數(shù)中參數(shù)定義
- urlstring,待解析的 url 字符串。
- scheme,是默認(rèn)的協(xié)議,比如 http 或者 https,url 字符串中如果不攜帶相關(guān)協(xié)議,可以通過 scheme 來指定,如果 url 中指定了相關(guān)協(xié)議則在 url 中生效。
- allow_fragments,是否忽略錨點(diǎn),設(shè)置為 False 即 fragment 部分會(huì)被忽略,反之不會(huì)忽略。
urlparse 的返回類型
函數(shù)返回的是一個(gè) urllib.parse.ParseResult 對(duì)象,獲取解析出來的 url 六個(gè)字段。
urlparse 應(yīng)用舉例
# 解析并輸出 url 中每個(gè)字段的字符串 import urllib url = 'http://www.baidu.com/urllib.parse.html;python?kw=urllib.parse#module-urllib' result = urllib.parse.urlparse(url) print(result) print(result.scheme, result.netloc, result.path, result.params, result.query, result.fragment, sep = '\n')
urllib.parse.urlunparse(parts)
與 urlparse 相反,通過列表或者元祖的形式將分段的字符串組合成一個(gè)完整的 url 字符串。
urlunparse 函數(shù)中參數(shù)定義
parts,可以是列表或者元組。
urlunparse 的返回類型
urlunparse 函數(shù)返回一個(gè)構(gòu)造好的 url 字符串。
應(yīng)用舉例
# 通過 data 列表或元組構(gòu)造一個(gè) url 并輸出 import urllib dataList = ['http', 'www.baidu.com', '/urllib.parse.html', 'python', 'kw=urllib.parse', 'modul-urllib'] # 六個(gè)字符串都必須填寫,否則會(huì)出現(xiàn) ValueError 錯(cuò)誤,如果某一字符串不存在則填入空字符 dataTuple = ('http', 'www.baidu.com', '/urllib.parse.html', '', 'kw=urllib.parse', 'modul-urllib') # 六個(gè)字符串都必須填寫,否則會(huì)出現(xiàn) ValueError 錯(cuò)誤,如果某一字符串不存在則填入空字符 urlList = urllib.parse.urlunparse(dataList) urlTuple = urllib.parse.urlunparse(dataTuple) print('1.urlList:%s\n2.urlTuple:%s' % (urlList, urlTuple))
urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)
與 urlparse 函數(shù)類似,但它只返回 url 字符串的5個(gè)字段,把 params 合并到 path 中。
urlsplit 應(yīng)用舉例
# 解析并輸出 url 中每個(gè)字段的字符串,params 會(huì)合并到 path 中。 import urllib url = 'http://www.baidu.com/urllib.parse.html;python?kw=urllib.parse#modul-urllib' result = urllib.parse.urlsplit(url) print(result) print(result.scheme, result.netloc, result.path, result.query, result.fragment, sep = '\n')
urllib.parse.urlunsplit(parts)
與 urlunparse 函數(shù)類似,它也是將 url 中各部分字段組合完整的 url 字符串的方法,唯一的區(qū)別是列表或元組的長度必須是5個(gè),因?yàn)樗?params 省略了。
urlunsplit 應(yīng)用舉例
# 通過 data 列表或元組構(gòu)造一個(gè) url 并輸出 import urllib dataList = ['http', 'www.baidu.com', '/urllib.parse.html;python', 'kw=urllib.parse', 'modul-urllib'] # 五個(gè)字符串都必須填寫,否則會(huì)出現(xiàn) ValueError 錯(cuò)誤,如果某一字符串不存在則填入空字符 dataTuple = ('http', 'www.baidu.com', '/urllib.parse.html;python', 'kw=urllib.parse', 'modul-urllib') # 五個(gè)字符串都必須填寫,否則會(huì)出現(xiàn) ValueError 錯(cuò)誤,如果某一字符串不存在則填入空字符 urlList = urllib.parse.urlunsplit(dataList) urlTuple = urllib.parse.urlunsplit(dataTuple) print('1.urlList:%s\n2.urlTuple:%s' % (urlList, urlTuple))
urllib.parse.quote(string, safe='/', encoding=None, errors=None)
使用 %xx 轉(zhuǎn)義字符替換字符串中的特殊字符,比如漢字。字母、數(shù)字和‘_.-~'字符不會(huì)被替換。
quote 函數(shù)中參數(shù)定義
- string,可以是 str 字符串或 bytes 類型。
- safe,可選參數(shù),默認(rèn)是'/',指明不應(yīng)該被替換的附加 ASCII 字符。
- encoding 和 errors,可選參數(shù),用來定義如何處理 non-ASCII 字符。一般默認(rèn)設(shè)置編碼方法為 encoding='utf-8',errors='strict',這意味著編碼錯(cuò)誤將引發(fā) UnicodeError。如果 string 是 bytes 類型,不能設(shè)置 encoding 和 errors,否則將引發(fā) TypeError。
quote 函數(shù)的返回類型
quote 函數(shù)返回一個(gè)編碼后的字符串。
應(yīng)用舉例
# 采用 quote 對(duì) url 中的漢字進(jìn)行編碼,輸出編碼后的結(jié)果 import urllib url = 'http://www.baidu.com/爬蟲' result = urllib.parse.quote(url) print(result) url = 'http://www.baidu.com/+爬蟲' result = urllib.parse.quote(url, '+') # 更改 safe 參數(shù) print(result)
urllib.parse.unquote(string, encoding='utf-8', errors='replace')
與 quote 函數(shù)相反,把 %xx 轉(zhuǎn)義字符替換成字符。
- unquote 函數(shù)的參數(shù)定義
- string,必須是 str 字符串。
- encoding 和 errors,可選參數(shù),定義如何將 %xx 轉(zhuǎn)義字符解碼為 Unicode 字符。encoding 默認(rèn)為 ‘utf-8',errors 默認(rèn)為 ‘replace',表示無效的轉(zhuǎn)義字符將會(huì)用占位符替換。
unquote 函數(shù)的返回類型
unquote 函數(shù)返回一個(gè)解碼后的字符串。
應(yīng)用舉例
# 解碼經(jīng)過 quote 函數(shù)處理后的 url,輸出解碼后的結(jié)果。 import urllib url = 'http://www.baidu.com/爬蟲' result = urllib.parse.quote(url) print(result) result = urllib.parse.unquote(url) print(result)
urllib.parse.urljoin(base, url, allow_fragments=True)
該函數(shù)用來將基本 url 與另一個(gè) url 組合,更新基本 url 字符串。它會(huì)使用 url 對(duì)基本 url 中缺失的部分進(jìn)行補(bǔ)充,比如 scheme (協(xié)議)、netloc (域名)和 path (路徑)。即根據(jù) url 字符串中帶有的字段,對(duì)基本 url 中沒有的字段進(jìn)行補(bǔ)充,已存在的字段進(jìn)行替換。
- urljoin 函數(shù)中參數(shù)定義
- base,是一個(gè)基本 url。
- url,將 scheme (協(xié)議)、netloc (域名)或 path (路徑)字段組合進(jìn)基本 url 的 url。
- allow_fragments,是否忽略錨點(diǎn),設(shè)置為 False 即 fragment 部分會(huì)被忽略,反之不會(huì)忽略。
urljoin 函數(shù)返回類型
返回組合成功的 url 字符串。
應(yīng)用舉例
# 基于 url 對(duì) base_url 進(jìn)行重新組合,并輸出組合結(jié)果。 import urllib base_url = 'http://www.baidu.com' url = 'https://www.google.com/urllib.parse.html;python?kw=urllib.parse#module-urllib' result = urllib.parse.urljoin(base_url,url,False) print(result)
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
urlencode 函數(shù)可以將字典轉(zhuǎn)化為 GET 請(qǐng)求中的 query (查詢條件),或者將字典轉(zhuǎn)化為 POST 請(qǐng)求中需要上傳的數(shù)據(jù)。
- urlencode 函數(shù)中參數(shù)定義
- query,字典類型。
- doseq,允許字典中一個(gè)鍵對(duì)應(yīng)多個(gè)值,編碼成 query (查詢條件)。
- safe、encoding 和 errors,這三個(gè)參數(shù)由 quote_via 指定。
urlencode 函數(shù)返回類型
urlencode 函數(shù)返回 str 字符串。
應(yīng)用舉例
# 創(chuàng)建 GET 請(qǐng)求 import urllib params = {'username':'xxx','password':'123'} base_url='http://www.baidu.com' url=base_url + '?' + urllib.parse.urlencode(params) print(url) params = {'username':['xxx', 'yyy'], 'password':'123'} # username 鍵對(duì)應(yīng)多個(gè)值 base_url='http://www.baidu.com' url=base_url + '?' + urllib.parse.urlencode(params) # doseq 設(shè)置為 False,會(huì)解析成亂碼 print(url) url=base_url + '?' + urllib.parse.urlencode(params, True) # doseq 設(shè)置為 True print(url)
urllib.robotparse 模塊
rebotparser 模塊提供了一個(gè) RobotFileParser 類,主要用來解析網(wǎng)站上發(fā)布的 robots.txt,然后根據(jù)解析內(nèi)容判斷爬蟲是否有權(quán)限來爬取這個(gè)網(wǎng)頁。
robots.txt 文件
robots.txt,存放于網(wǎng)站根目錄下,采用 ASCII 編碼的文本文件,記錄此網(wǎng)站中的哪些內(nèi)容是不應(yīng)被爬蟲獲取的,哪些是可以被爬蟲獲取的。
robots.txt 文件內(nèi)容舉例
User-agent: * Disallow: / Allow: /public/
- User-agent,爬蟲的名稱,將其設(shè)置為 * 代表協(xié)議對(duì)任何爬蟲有效,如果設(shè)置為 Baiduspider 則代表協(xié)議僅對(duì)百度爬蟲有效,要是有多條則對(duì)多個(gè)爬蟲有效,至少需要指定一條。
- Disallow,網(wǎng)頁中不允許抓取的目錄,上述例子中設(shè)置的 / 代表不允許抓取所有的頁面。
- Allow,一般和 Disallow 一起使用,用來排除單獨(dú)的某些限制,上述例子中設(shè)置為 /public/ 表示所有頁面不允許抓取,但可以抓取 public 目錄。
urllib.robotparser.RobotFileParser(url='') 類及其常用方法
- set_url(url),設(shè)置引用 robots.txt 文件的 url,如果在創(chuàng)建 RobotFileParser 對(duì)象時(shí)傳入了 url,那么就不需要使用這個(gè)方法設(shè)置 url。
- read(),讀取 robots.txt 文件并將其提供給解析器,不返回任何內(nèi)容。
- parse(lines),用來解析 robots.txt 某些行的內(nèi)容,并安裝語法規(guī)則來分析內(nèi)容。
- can_fetch(useragent, url),傳入兩個(gè)參數(shù),用戶代理以及要爬取的網(wǎng)站,返回的內(nèi)容是該用戶代理否可以抓取這個(gè)網(wǎng)站,結(jié)果為 True 或 False。
到此這篇關(guān)于python3 中使用urllib問題以及urllib詳解的文章就介紹到這了,更多相關(guān)python3使用urllib內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+eval函數(shù)實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式詳解
Python的 eval() 允許從基于字符串或基于編譯代碼的輸入中計(jì)算任意Python表達(dá)式。當(dāng)從字符串或編譯后的代碼對(duì)象的任何輸入中動(dòng)態(tài)計(jì)算Python表達(dá)式時(shí),此函數(shù)非常方便。本文將利用eval實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式,需要的可以參考一下2022-09-0915行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門歌單實(shí)例教程
這篇文章主要給大家介紹了關(guān)于利用15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門歌單的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Python中高效的json對(duì)比庫deepdiff詳解
deepdiff模塊常用來校驗(yàn)兩個(gè)對(duì)象是否一致,包含3個(gè)常用類,DeepDiff,DeepSearch和DeepHash,其中DeepDiff最常用,可以對(duì)字典,可迭代對(duì)象,字符串等進(jìn)行對(duì)比,使用遞歸地查找所有差異,今天我們就學(xué)習(xí)一下快速實(shí)現(xiàn)代碼和文件對(duì)比的庫–deepdiff2022-07-07python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例
本文將會(huì)使用Python實(shí)現(xiàn)一個(gè)最簡單的RPC框架,不具有實(shí)用意義,但可以讓你清醒地理解RPC框架的幾個(gè)組成部分,只是比看Python自帶的xmlrpc清晰。2020-10-10使用python?pywin32模塊創(chuàng)建windows服務(wù)實(shí)例探究
這篇文章主要為大家介紹了使用python?pywin32模塊創(chuàng)建windows服務(wù)實(shí)現(xiàn)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01