python urllib庫

来源:https://www.cnblogs.com/smelond/archive/2018/03/12/8547469.html
-Advertisement-
Play Games

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。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 銷售license是商業軟體的貫用商業模式。用戶向商家購買軟體安裝盤搭載license許可,用戶才可以使用該系統。我們作為一個軟體開發者,為了保護自身的版權,在軟體開發過程中也不可避免的會設計license管控機制。下麵就講一下設計一個基礎的license控制機制需要考慮的方方面面。 license ...
  • 電腦的組成 1、控制器 2、運算器(CPU) 3、主存儲器(記憶體) 4、外存 5、輸入、輸出設備 存儲器:主存和外存 數據的表示 對於任意一個R進位數,它的每一位數值等於該位的數位乘以該位的權數。權數由Rk表示,K與該位和小數點之間的距離有關。當該位位於小數點左邊,K值是該位和小數點之間的數位的個... ...
  • 簡介 在軟體開發過程中,會遇到很多重覆性的地方,設計模式就是開發前輩將一點一點開發經驗整合成便於他人重覆使用、高效率的代碼模板。學習開發人員使用設計模式開發能大大提高開發效率。從而使得代碼的可維護性、健壯性提高。 單例模式 單例模式要求類只能創建唯一的一個實例。一般情況下,構造器在訪問許可權類型都是公 ...
  • 現在出現了很多中間件解決跨語言問題,使用RPC遠程調用;但是龐大是個問題,而且要按照格式使用。尤其是源碼量比較龐大。 為了簡單易用,我採用訂閱發佈模型,在此基礎上創建了fastRPC,模擬RPC,調用遠端方法。 其實主要過程就是通過提供的類,將每個參數打包為特定格式,按照類型名稱,在服務端匹配轉換; ...
  • 工業互聯網剛剛興起,十九大和兩會領導人也多次提及。但是對於新生事物,每個廠家、每個組織、每個人的都理解都不一樣,甚至千差萬別,正因為如此才會有無限生機。但是也有其共性的東西,1、要是一個雲平臺、2、是一個資源平臺,3、是一個物聯網平臺,4、是一個數據存儲平臺、5、是一個分析平臺......更高是工業 ...
  • 創建型 單例模式 餓漢式 懶漢式 雙重校驗鎖 工廠模式 圖例 簡單工廠模式 工廠模式 簡單工廠VS工廠 相同 : 工廠負責產品類的創建,使用者需要使用產品類的時候直接請求工廠就與產品類複雜的創建和實現分離了,只關註它的介面,只要它的介面滿足使用者要求就不會影響上層模塊,後期當產品類變化時,維護起來也 ...
  • 介紹: 從MVC是一種維護性較強、耦合性低的新的架構MVVM(Model View View-Mode),MVVM正式規範了視圖和控制器緊耦合的性質,並引入新的組件。MVVM主要目的是為了分離視圖(View)和模型(Model)。它促進了 UI 代碼與業務邏輯的分離。它正式規範了視圖和控制器緊耦合的 ...
  • Java如今的市場不如從前,競爭很大,工資非常高,標準非常高,想要勝任一份高薪的工作不是那麼容易,只有掌握最新的行情才能更好的瞭解Java,才能更好的在這個領取發展,讓新手小白瞭解Java市場行情如下:行情一:五年後和五年前的區別,在五年我們這個行業不僅僅缺人才,連新手都缺,那個時候公司願意招聘實習 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...