python2和python3中的urllib urllib提供了一個高級的 Web 通信庫,支持基本的 Web 協議,如 HTTP、FTP 和 Gopher 協議,同時也支持對本地文件的訪問。 具體來說,urllib 模塊的功能是利用前面介紹的協議來從網際網路、區域網、本地主機上下載數據。 使用這個 ...
python2和python3中的urllib
urllib提供了一個高級的 Web 通信庫,支持基本的 Web 協議,如 HTTP、FTP 和 Gopher 協議,同時也支持對本地文件的訪問。
具體來說,urllib 模塊的功能是利用前面介紹的協議來從網際網路、區域網、本地主機上下載數據。
使用這個模塊就無須用到 httplib、ftplib和 gopherlib 這些模塊了,除非需要用到更低層的功能。
Python 2 中有 urlib、urlparse、urllib2,以及其他內容。在 Python 3 中,所有這些相關模塊都整合進了一個名為 urllib 的單一包中。
urlib 和 urlib2 中的內容整合進了 urlib.request模塊中,urlparse 整合進了 urllib.parse 中。
Python 3 中的 urlib 包還包括 response、error 和robotparse 這些子模塊。
URL的格式
prot_sch://net_loc/path;params?query#frag
URL的各個部分(Web地址的各個組件)
prot_sch 網路協議或下載方案 net_loc 伺服器所在地(也含有用戶信息) path 使用斜杠(/)分割的文件或CGI應用的路徑 params 可選參數 query 連接符(&)分割的一系列鍵值對 frag 指定文檔內特定錨的部分 net_loc 可以進一步拆分成多個組件,一些是必備的,另一些是可選的: user:passwd@host:port user 用戶名或登錄 passwd 用戶密碼 host 運行web伺服器的電腦名稱或地址(必須的) port 埠號(如果不是預設的80)
urllib.parse模塊
在python2中叫做urlparse,在python3中已經改名為urllib.parse
urllib.parse 模塊提供了一些基本功能,用於處理 URL 字元串。這些功能包括 urlparse()、urlunparse()和 urljoin()。
urllib.parse 模塊中的核心函數描述
urlparse(urlstr,defProSch=None,allowFrag=None) 將urlstr解析成各個組件,如果在urlstr中沒有給定協議或方案,則使用defProtSch;allowFrag 決定是否允許有 URL 片段 urlunparse(urltup) 將 URL 數據(urltup)的一個元組拼成一個 URL 字元串 urljoin(baseurl, newurl, allowFrag=None) 將 URL 的根功能變數名稱和 newurl 拼合成一個完整的 URL;allowFrag 的作用和urlpase()相同
urlparse()將 urlstr 解析成一個 6 元組(prot_sch, net_loc, path, params, query, frag):
語法:urlparse(urlstr, defProtSch=None, allowFrag=None) >>> urllib.parse.urlparse("https://www.smelond.com?cat=6") ParseResult(scheme='https', netloc='www.smelond.com', path='', params='', query='cat=6', fragment='')
urlunparse()的功能與 urlpase()完全相反,其將經 urlparse()處理的 URL 生成 urltup 這個 6元組(prot_sch, net_loc, path, params, query, frag),拼接成 URL 並返回:
語法:urlunparse(urltup) >>> result = urllib.parse.urlparse("https://www.smelond.com") >>> print(result) ParseResult(scheme='https', netloc='www.smelond.com', path='', params='', query='', fragment='') >>> urllib.parse.urlunparse(result) 'https://www.smelond.com'
在需要處理多個相關的 URL 時我們就需要使用 urljoin()的功能了,例如,一個 Web 頁中可能會產生一系列頁面 URL:
urljoin()取得根功能變數名稱,並將其根路徑(net_loc 及其前面的完整路徑,但是不包括末端的文件)與 newurl 連接起來。
語法:urljoin (baseurl, newurl, allowFrag=None) >>> urllib.parse.urljoin("https://www.smelond.com?cat=6","?cat=7") 'https://www.smelond.com?cat=7' >>> urllib.parse.urljoin("https://www.smelond.com?cat=6","abc") 'https://www.smelond.com/abc' >>> urllib.parse.urljoin("https://www.smelond.com?cat=6","/test/abc.html") 'https://www.smelond.com/test/abc.html' >>> urllib.parse.urljoin("https://www.smelond.com","abc.html") 'https://www.smelond.com/abc.html'
urllib模塊/包
urllib 模塊提供了許多函數,可用於從指定 URL 下載數據,同時也可以對字元串進行編碼、解碼工作,以便在 URL 中以正確的形式顯示出來。
urllib.request.urlopen()
urlopen()打開一個給定 URL 字元串表示的 Web 連接,並返迴文件類型的對象:
語法:urlopen (urlstr, postQueryData=None) from urllib.request import urlopen x = urlopen("https://www.smelond.com") data = x.read().decode("utf-8") print(data) <!DOCTYPE HTML><html><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=10,IE=9,IE=8">.......一堆html輸出中 <!--壓縮前的大小: 20278 bytes; 壓縮後的大小: 19511 bytes; 節約:3.78% -->
urllib.request.urlopen()文件類型對象的方法:
f.read() 從f中讀出所有或bytes個位元組 f.readline() 從f中讀取一行 f.readlines() 從f中讀出所有行,作為列表返回 f.close() 關閉f的URL連接 f.fileno() 返回f的文件句柄 f.info() 獲得f的MIME頭文件 f.geturl() 返回f的真正URL
from urllib.request import urlopen x = urlopen("https://www.smelond.com") data = x.info() print(data) Server: nginx Date: Mon, 12 Mar 2018 07:36:18 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Accept-Encoding X-Powered-By: PHP/5.5.38 Link: <https://www.smelond.com/index.php?rest_route=/>
urllib.request.urlretrieve()
urlretrieve()不是用來以文件的形式訪問並打開 URL,而是用於下載完整的 HTML,把另存為文件(當然,他可以直接下載文件)
語法:urlretrieve(url, filename=None, reporthook=None, data=None) from urllib.request import urlretrieve urlretrieve("https://www.smelond.com", filename="test.html")
urllib.parse.quote()和urllib.parse.quote_plus()
quote*()函數用來獲取 URL 數據,並將其編碼,使其可以用於 URL 字元串中。
safe 字元串可以包含一系列不能轉換的字元,預設字元是斜線(/)。
語法:quote(urldata, safe='/') from urllib.parse import quote name = "smelond" number = 6 base = "https://" query = "cat" print(quote("%s%s.com/?%s=%d and 1=1" % (base, name, query, number), safe="?/=: ")) #註意我最後有一個空格 print(quote("%s%s.com/?%s=%d and 1=1" % (base, name, query, number))) https://smelond.com/?cat=6 and 1=1 #上面加排除了空格,所有and旁邊沒有翻譯成為%20 https%3A//smelond.com/%3Fcat%3D6%20and%201%3D1 #預設/不轉換
quote_plus()與 quote()很像,只是它還可以將空格編碼成“+”號:
from urllib.parse import quote_plus name = "smelond" number = 6 base = "https://" query = "cat" print(quote_plus("%s%s.com/?%s=%d and 1=1" % (base, name, query, number), safe="?/=: ")) print(quote_plus("%s%s.com/?%s=%d and 1=1" % (base, name, query, number))) https://smelond.com/?cat=6+and+1=1 https%3A%2F%2Fsmelond.com%2F%3Fcat%3D6+and+1%3D1 #輸出結果中看出不管是否排除“空格”,quote_plus都會將空格變為+號,而且沒有預設的safe
urllib.parse.unquote()和 urllib.parse.unquote_plus()
unquote*()函數與 quote*()函數的功能完全相反,前者將所有編碼為“%xx”式的字元轉換成等價的 ASCII 碼值。
調用 unquote()函數將會把 urldata 中所有的 URL 編碼字母都解碼,並返回字元串。unquote_plus()函數會將加號轉換成空格符。
語法:unquote*(urldata) from urllib.parse import unquote from urllib.parse import unquote_plus print(unquote("https%3A//smelond.com/%3Fcat%3D6%20and%201%3D1")) print(unquote_plus("https%3A%2F%2Fsmelond.com%2F%3Fcat%3D6+and+1%3D1")) https://smelond.com/?cat=6 and 1=1 https://smelond.com/?cat=6 and 1=1
urllib.urlencode()
urlopen()函數接收字典的鍵值對,並將其編譯成字元串,鍵值對的格式是“鍵=值”,以連接符(&)劃分。
另外,鍵及其對應的值會傳到quote_plus()函數中進行適當的編碼。
from urllib.parse import urlencode adict = {"name": "smelond", "cat": "6", " and 1": "1"} print("https://www.smleond.com&%s" % urlencode(adict)) https://www.smleond.com&name=smelond&cat=6&+and+1=1
urllib模塊中的核心函數
urlopen(urlstr, postQueryData=None) 打開 URL urlstr,如果是 POST 請求,則通過 postQueryData 發送請求的數據 urlretrieve(urlstr, localfile=None,downloadStatusHook=None) 將 URL urlstr 中的文件下載到 localfile 或臨時文件中(如果沒有指定 localfile); 如果函數正在執行,downloadStatusHook 將會獲得下載的統計信息 quote(urldata, safe='/') 對 urldata 在 URL 里無法使用的字元進行編碼,safe 中的字元無須編碼 quote_plus(urldata, safe='/') 除了將空格編譯成加(+)號(而非%20)之外,其他功能與 quote()相似 unquote(urldata) 將 urldata 中編碼過的字元解碼 unquote_plus(urldata) 除了將加號轉換成空格,其他功能與 unquote()相同 urlencode(dict) 將 dict 的鍵值對通過 quote_plus()編譯成有效的 CGI 查詢字元串,用 quote_plus()對這個字元串進行編碼
urllib 模塊通過安全套接字層(SSL)支持開放的 HTTP 連接(socket 模塊的核心變化是增加並實現了 SSL)。
httplib 模塊支持使用“https”連接方案的 URL。除了那兩個模塊以外,其他支持 SSL 的模塊還有 imaplib、poplib 和 smtplib。