主頁 > 後端開發 > Python第十三章-網路編程

Python第十三章-網路編程

2020-10-07 09:40:43 後端開發

目錄
  • 網路編程
    • 一、網路編程基礎
      • 1.1通信協議
      • 1.2TCP/IP協議
        • 附錄:OSI 七層參考模型
      • 1.3 IP 地址和埠號
        • 1.3.1 IP 地址
          • IPV4地址
          • IPV6地址
        • 1.3.2埠
    • 二、TCP編程
      • 2.1什么是Socket
        • Socket families
        • 基于檔案的套接字:AF_UNIX
        • 基于網路的套接字:AF_INET
        • socket模塊
      • 2.2 TCP 客戶端編程
      • 2.3 TCP 服務器編程
      • 2.4 運行服務器和客戶端
    • 三、UDP編程
      • 3.1 UDP客戶端編程
      • 3.2 UDP服務器編程
      • 3.3 運行UDP服務器和客戶端
    • 四、socket模塊其他屬性和函式
    • 五、python web 客戶端
      • 5.1 HTTP 協議簡介
        • 5.1.1 什么是 HTTP 協議
        • 5.1.2 HTTP 協議發展簡史
        • 5.1.3 HTTP 協議作業原理
        • 5.1.4 HTTP協議格式
        • 5.1.5 請求協議格式
        • 5.1.6 回應協議格式
        • 5.1.7 GET 請求和 POST 請求的區別
      • 5.2 URL
        • 5.2.1 URL
      • 5.3 urllib包和parse模塊
        • 5.3.1 urllib包
        • 5.3.2 parse模塊
          • 1. parse.urlparse()
          • 2. parse.urlunparse()
          • 3. parse.urljoin()
      • 5.4 request模塊
        • request.urlopen()
        • urlopen()的回傳值類檔案物件

網路編程

一、網路編程基礎

python 的網路編程模塊主要支持兩種Internet協議: TCP 和 UDP.

1.1通信協議

通信協議也叫網路傳輸協議或簡稱為傳送協議(Communications Protocol),是指計算機通信或網路設備的共同語言,

現在最普及的計算機通信為網路通信,所以“傳送協議”一般都指計算機通信的傳送協議,如:TCP/IP、NetBEUI、HTTP、FTP等,

然而,傳送協議也存在于計算機的其他形式通信,例如:面向物件編程里面物件之間的通信;作業系統內不同程式之間的訊息,都需要有一個傳送協議,以確保傳信雙方能夠溝通無間,


1.2TCP/IP協議

在Internet中TCP/IP協議是使用最為廣泛的通訊協議(互聯網上的一種事實的標準),TCP/IP是英文Transmission Control Protocol/Internet Protocol的縮寫,意思是“傳輸控制協議/網際協議”

TCP/IP 協議是一個工業標準協議套件,專為跨廣域網(WAN)的大型互聯網路而設計,

TCP/IP 網路體系結構模型就是遵循TCP/IP 協議進行通信的一種分層體系,現今,Internet和Intranet所使用的協議一般都為TCP/IP 協議,

在了解該協議之前,我們必須掌味訓于該協議的體系結構層次,而TCP/IP體系結構分為四層,

第 1 層 網路介面層
包括用于協作IP資料在已有網路介質上傳輸的協議,提供TCP/IP協議的資料結構和實際物理硬體之間的介面,比如地址決議協議(Address Resolution Protocol, ARP )等,

第 2 層 網路層
對應于OSI模型的網路層,主要包含了IP、RIP等相關協議,負責資料的打包、尋址及路由,還包括網間控制報文協議(ICMP)來提供網路診斷資訊,

第 3 層 傳輸層
對應于OSI的傳輸層,提供了兩種端到端的通信服務,分別是TCP和UDP協議,

第 4 層 應用層
對應于OSI的應用層、表達層和會話層,提供了網路與應用之間的對話介面,包含了各種網路應用層協議,比如Http、FTP等應用協議,


附錄:OSI 七層參考模型


1.3 IP 地址和埠號

1.3.1 IP 地址

互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議地址),縮寫為IP地址(英語:IP Address)

IP 地址是分配給網路上使用網際協議(英語:Internet Protocol, IP)的設備的數字標簽,常見的IP地址分為IPv4與IPv6兩大類,


IPV4地址

IP地址由32位二進制陣列成,為便于使用,常以XXX.XXX.XXX.XXX形式表現,每組XXX代表小于或等于255的10進制數,例如維基媒體的一個IP地址是208.80.152.2,

地址可分為A、B、C、D、E五大類,其中E類屬于特殊保留地址,
IP地址是唯一的,目前IP技術可能使用的IP地址最多可有4,294,967,296個(即232),驟看可能覺得很難會用盡,但由于早期編碼和分配上的問題,使很多區域的編碼實際上被空出或不能使用,加上互聯網的普及,使大部分家庭都至少有一部電腦,連同公司的電腦,以及連接網路的各種設備都消耗了大量IPv4地址資源,

隨著互聯網的快速成長,IPv4的42億個地址的分配最終于2011年2月3日用盡[1][2],相應的科研組織已研究出128位的IPv6,其IP地址數量最高可達3.402823669 × 1038個,屆時每個人家居中的每件電器,每件物件,甚至地球上每一粒沙子都可以擁有自己的IP地址,

在A類、B類、C類IP地址中,如果主機號是全1,那么這個地址為直接廣播地址,它是用來使路由器將一個分組以廣播形式發送給特定網路上的所有主機,32位全為1的IP地址“255.255.255.255”為受限廣播地址("limited broadcast" destination address),用來將一個分組以廣播方式發送給本網路中的所有主機,路由器則阻擋該分組通過,將其廣播功能限制在本網內部,


IPV6地址

IPv6地址為128位長但通常寫作8組每組四個十六進制數的形式,例如:
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
是一個合法的IPv6地址,

IPv4地址可以很容易的轉化為IPv6格式,舉例來說,如果IPv4的一個地址為135.75.43.52(十六進制為0x874B2B34),它可以被轉化為0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34,同時,還可以使用混合符號(IPv4-compatible address),則地址可以為::135.75.43.52,


1.3.2埠

在網路技術中,埠(Port)包括邏輯埠和物理埠兩種型別,

物理埠指的是物理存在的埠,如ADSL Modem、集線器、交換機、路由器上用 于連接其他網路設備的介面,如RJ-45埠、SC埠等等,

邏輯埠是指邏輯意義上用于區分服務的埠,如TCP/IP協議中的服務埠,埠號的范圍從0到65535,比如用于瀏覽網頁服務的80埠,用于FTP服務的21埠等,由于物理埠和邏輯埠數量較多,為了對埠進行區分,將每個埠進行了編號,這就是埠號,

我們主要研究的是邏輯埠號.我們平時所說的埠號也是指的邏輯埠號

埠是一個軟體結構,被客戶程式或服務程式用來發送和接收資料,一臺服務器有 256*256個埠, 埠號范圍: 0 - 65535

0-1023是公認埠號,即已經公認定義或為將要公認定義的軟體保留的

1024-65535是并沒有公共定義的埠號,用戶可以自己定義這些埠的作用,

埠與協議有關:TCP和UDP的埠互不相干

二、TCP編程

什么是 TCP 協議

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接(連接導向)的、可靠的、基于IP的傳輸層協議,

彌補了IP協議的不足,屬于一種較高級的協議,它實作了資料包的有力捆綁,通過排序和重傳來確保資料傳輸的可靠(即資料的準確傳輸以及完整性),

排序可以保證資料的讀取是按照正確的格式進行,重傳則保證了資料能夠準確傳送到目的地!

使用 TCP 協議通信是, 首先創建 TCP 連接, 主動發起連接的叫客戶端, 被動回應連接的叫服務器

比如:
當我們在瀏覽器中訪問新浪主頁時,我們自己的計算機就是客戶端,瀏覽器會主動向新浪的服務器發起連接,如果一切順利,新浪的服務器接受了我們的連接,一個TCP連接就建立起來的,后面的通信就是發送網頁內容了,

2.1什么是Socket

Socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求,使主機間或者一臺計算機上的行程間可以通訊,

可以把Socket理解成類似插座的東西, 通過Socket就可以發送和接受資料了, 就像插座插上電器之后就可以向外提供電能了.

TCP編程的客戶端和服務器端都是通過Socket來完成的.

其實UDP協議通信也是使用的套接字, 和TCP協議稍有差別. TCP是面向連接的套接字, 而UDP是面向無連接的套接字.


套接字的起源可以追溯到20世紀70年底, 他是加利福尼亞大學的伯克利版本 Unix(也成 BSD Unix) 的一部分. 因此, 有時你可能會聽過將套接字稱為伯克利套接字或 BSD 套接字.

套接字最初是為同一主機上的應用程式鎖創建, 使得主機上一個程式(也叫一個行程)與另一個允許的程式進行通信. 這就是所謂的行程間通信(Inter Process Communication IPC)


Socket families

有兩種型別的套接字: 基于檔案的和面向物件的.


基于檔案的套接字:AF_UNIX

AF_UNIX是基于檔案的套接字.

因為兩個行程允許在同一臺計算機上, 所以這些套接字都是基于檔案的, 這意味著檔案系統支持他們的底層基礎結構. 這是能夠說的通的, 因為檔案系統是一個運行在同一主機上的多個行程之間的共享常量.

AF_UNIX在編程的時候并不是太常用.


基于網路的套接字:AF_INET

AF_INET用于基于網路的Socket. 還有一個地址家族AF_INET6, 用于IPv6.

其實還有一些其他地址家族, 哪些要么是專業的, 過時的, 很少使用的, 要么是仍未實作的.

在所有的地址家族中, AF_INET是使用最廣泛的.

因為本章重點討論網路編程, 所以本章剩余的內容中, 都是將使用AF_INET


socket模塊

要創建套接字, 必須使用socket模塊下的socket()函式.

他的一般語法如下:

import socket


socket.socket(socket_family, socket_type, protocal=0)

說明:

1, 其中, socket_familyAF_UNIX 或 AF_INET, Socket_type如果是TCP編程是SOCKET_STREAM, 如果是 UDP 編程則使用SOCKET_DGRAM. protocal通常省略, 默認是0

  1. 回傳值就是Socket物件. Socket物件提供了一些方法來讓我們操作這些套接字.

2.2 TCP 客戶端編程

客戶端代碼參考下面的代碼:

from socket import *

host = "localhost"  # 客戶端準備連接的服務器的地址
port = 10000  # 服務器的埠號
address = (host, port)  # 服務器的地址

bufSize = 1024  # 客戶端緩沖區的大小(單位位元組)

tcpCliSock = socket(AF_INET, SOCK_STREAM)  # 所有的套接字都使用 socket 函式來創建
tcpCliSock.connect(address)  # 客戶端去連接服務器

while True:
    data = https://www.cnblogs.com/yanadoude/p/input("> ")  # 從鍵盤讀取資料
    if not data:
        break
    # 給服務器發送訊息. 由于 send 只能發送位元組資料,所以把字串編碼之后再發送
    tcpCliSock.send(data.encode("utf-8"))
    
    data = tcpCliSock.recv(bufSize)  # 接受服務器發送來的資訊
    if not data:
        break
    # 由于通過網路傳遞過來的其實是位元組資料, 解碼之后再輸出
    print(data.decode("utf-8"))

tcpCliSock.close()

2.3 TCP 服務器編程

服務器代碼參考下面的代碼:

from socket import *

host = "localhost"  # 服務器要系結的主機地址
port = 10000  # 服務器要監聽的埠號
address = (host, port)
bufSize = 1024  # 設定服務器的緩沖區大小
tcpSevSock = socket(AF_INET, SOCK_STREAM)  # 創建 socket 物件
tcpSevSock.bind(address)  # 把 socket 系結到指定的地址和埠
tcpSevSock.listen()  # 開啟服務器監聽器

print("正在等等客戶端連接...")
tcpCliSock, cliAddress = tcpSevSock.accept()  # 接受客戶端的連接
print("來自:", cliAddress, "的連接...")

while True:
    data = tcpCliSock.recv(bufSize)  # 接受客戶端發來的資料
    if not data:
        break
    # 把接收到位元組資料解碼
    data = data.decode("utf-8")
    # 向客戶端發送資料. 先把字串編碼, 再發送
    tcpCliSock.send(("我是...服務器...你的資訊是:" + data).encode("utf-8"))

tcpCliSock.close()  # 關閉客戶端
tcpSevSock.close()  # 關閉服務器

2.4 運行服務器和客戶端

執行 TCP 服務器和客戶端

現在開始運行服務器和客戶端程式, 看看他們是如何作業的.

那么應該先運行客戶端還是服務器呢?

當然是先運行服務器, 讓服務器先處于等等客戶端接入的狀態, 這樣在客戶端申請接入的時候才不會出錯.

其實, 服務器是被動端, 客戶端是主動端.

三、UDP編程

UDP簡介

UDP也叫用戶資料報協議

UDP編程相比TCP編程簡單了很多.

因為UDP不是面向連接的, 而是面向無連接的.

TCP是面向連接的, 客戶端和服務端必須連接之后才能通訊, 就像打電話, 必須先接通才能通話.

UDP是面向無連接的, 一方負責發送資料(客戶端), 只要知道對方(接受資料:服務器) 的地址就可以直接發資料了, 但是能不能達到就沒有辦法保證了.

雖然用UDP傳輸面向無連接, 資料不可靠,但它的優點是和TCP比,速度快,對于不要求可靠到達的資料,就可以使用UDP協議, 比如局域網的視頻同步, 使用 udp 是比較合適的:快, 延遲越小越好

創建UDPSocket物件

創建方式和TCPSocket一樣的, 只是需要把socket_tpye的值設定為SOCKET_DGRAM

socket(AF_INET, SOCKET_DGRAM)

3.1 UDP客戶端編程

參考下面的代碼:

from socket import *

host = "localhost"  # 對方地址
port = 20000  # 對方埠
address = (host, port)

bufSize = 1024

udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:
    data = https://www.cnblogs.com/yanadoude/p/input("> ")
    if not data:
        break
    # 把資料發送到指定的 udp 服務器
    udpCliSock.sendto(data.encode("utf-8"), address)
    
udpCliSock.close()

3.2 UDP服務器編程

UDP服務器需要做的事情比較少, 除了等待傳入的連接之外, 幾乎不需要做其他作業.

參考下面的代碼:

from socket import *

host = "localhost"  # 服務器要系結的地址
port = 20000  # 服務器要系結的埠
address = (host, port)

bufSize = 1024

udpServeSock = socket(AF_INET, SOCK_DGRAM)
udpServeSock.bind(address)

while True:
    print("等待有人給我發資訊:")
    data, cliAddress = udpServeSock.recvfrom(bufSize)
    print(cliAddress, "發來的資訊是:", data.decode("utf-8"))

udpServeSock.close()

3.3 運行UDP服務器和客戶端

仍然需要先執行服務器再執行客戶端.

四、socket模塊其他屬性和函式

socket模塊中, 除了目前熟悉的socket.socket()函式之外, 還提供了更多用于網路應用開發的屬性.


屬性 描述
AF_UNIX, AF_INET, AF_INET6, AF_NETLINK, AF_TIPC python 中支持的套接字地址家族
SOCK_STREAM, SOCK_DGRAM 套接字型別(TCP=流, UDP=資料包)
has_ipv6 指示是否支持 IPv6的布爾標記

例外 描述
error 套接字相關錯誤
haserror 主機和地址相關錯誤
gaierror 地址相關錯誤
timeout 超時時間

函式 描述
socket() 創建套接字物件
getaddrinfor() 獲取一個五元組序列形式的地址資訊
getnameinfo() 給定一個套接字地址, 回傳二元組(主機名, 埠號)
getfqdn() 回傳完整域名
gethostname() 回傳當前主機名
gethostbyname() 將一個主機名, 映射到他的 ip 地址
gethostbyname_ex() gethostbyname()的擴展版本, 回傳主機名, 別名主機集合和 ip 地址串列

五、python web 客戶端

TCPUDP是比較低級的協議, 是底層網路通訊協議, 是當今因特網中大部分客戶端/服務器協議的核心.

大部分情況我們并不會直接使用TCP, UDP去編程, 而是使用更加高級的協議去編程.

比如 HTTP(超文本傳輸協議), FTP(檔案傳輸協議)等.

本節內容主要學習使用 HTTP 去訪問互聯網中的內容.

所以我們先從 HTTP 協議開始講起, 他是目前互聯網上應用最廣泛的通信協議.

5.1 HTTP 協議簡介

5.1.1 什么是 HTTP 協議

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議,

HTTP 是基于 TCP/IP 協議的應用層協議,它不涉及資料包(packet)傳輸,主要規定了客戶端和服務器之間的通信格式,默認使用80埠,


5.1.2 HTTP 協議發展簡史

  1. 最早版本是1991年發布的0.9版,該版本極其簡單,只有一個命令GET,
  2. 1996年5月,HTTP/1.0 版本發布,內容大大增加,
    任何格式的內容都可以發送,這使得互聯網不僅可以傳輸文字,還能傳輸影像、視頻、二進制檔案,這為互聯網的大發展奠定了基礎,
  3. 1997年1月,HTTP/1.1 版本發布,只比 1.0 版本晚了半年,它進一步完善了 HTTP 協議,一直用到了20年后的今天,直到現在還是最流行的版本,

5.1.3 HTTP 協議作業原理

HTTP協議作業于客戶端-服務端架構為上, 是一種請求應答式的.

瀏覽器(或其他客戶端)作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求,Web服務器根據接收到的請求后,向客戶端發送回應資訊,


5.1.4 HTTP協議格式

通信規則規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式,

客戶端發送給服務器的格式叫“請求協議”;

服務器發送給客戶端的格式叫“回應協議”,

重點學習這兩個格式,


5.1.5 請求協議格式

請求行   例:GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif檔案,
請求頭   例:Accept-Language: en(很多請求頭)
空行     必須的,服務通過這個空行來區別出請求頭和請求體
請求體   有時候也叫訊息體,是可選的,get請求時無請求體,post請求會有,

瀏覽器向服務器發送請求時必須依據該格式,否則服務器無法識別,http協議中的請求行中可以有8種請求方法,但是目前為止,通用和大家都在用的只有兩種:post請求和get請求,


5.1.6 回應協議格式

狀態行;
回應頭資訊;
空行;
回應體(回應正文),

5.1.7 GET 請求和 POST 請求的區別

注意區別就是請求資料的傳送方式:

1.GET 方法

查詢字串(名稱/值對)是在 GET 請求的 URL 中發送的:

/test/demo_form.asp?name1=value1&name2=value2

2.POST 方法

請求資料(名稱/值對)是在 POST 請求的 HTTP 訊息主體中發送的:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com

name1=value1&name2=value2

比較

專案 GET POST
后退按鈕/重繪 無害 資料會被重新提交(瀏覽器應該告知用戶資料會被重新提交),
書簽 可收藏為書簽 不可收藏為書簽
快取 能被快取 不能快取
編碼型別 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data,為二進制資料使用多重編碼,
歷史 引數保留在瀏覽器歷史中, 引數不會保存在瀏覽器歷史中,
對資料長度的限制 是的,當發送資料時,GET 方法向 URL 添加資料;URL 的長度是受限制的(URL 的最大長度是 2048 個字符), 無限制,
對資料型別的限制 只允許 ASCII 字符, 沒有限制,也允許二進制資料,
安全性 與 POST 相比,GET 的安全性較差,因為所發送的資料是 URL 的一部分,在發送密碼或其他敏感資訊時絕不要使用 GET ! POST 比 GET 更安全,因為引數不會被保存在瀏覽器歷史或 web 服務器日志中,
可見性 資料在 URL 中對所有人都是可見的, 資料不會顯示在 URL 中,

5.2 URL

前面我們用瀏覽器使用 HTTP 協議去訪問網路, 但是有一點大家需要記住, 瀏覽器只是 web 客戶端的一種,

  1. 可以這么說, 任何一個向 web 服務器發送求來獲得應用程式的都是客戶端,
  2. 瀏覽器作為一個比較特別的客戶端,主要用于瀏覽網頁內容并同其他 web 站點互動,
  3. 而一個更普通的客戶端可以完成更多的作業,不僅可以下載資料, 還可以存盤、操作資料, 甚至可以將其傳送到另外一個地方或者傳給另外一個應用,

python 提供的 urllib 模塊, 使用它, 就可以撰寫可以下載或或者訪問互聯網上資訊的簡單 web 客戶端,

你首先需要做的就是為程式提供一個有效的 web 網址, 這個 web 網站就是一個URL

我們先了解URL是什么?

5.2.1 URL

URL 是Uniform Resource Locator的縮寫, 中文叫:統一資源定位符,

瀏覽網頁需要 URL, 這個 URL 就表示這個網頁的地址, 這個地址用來在 web 上定位定位一個檔案,

如街道地址一樣, URL 地址也有一些結構,URL 使用如下的這種格式:

prot_sch://net_loc/path;params?query#frag

URL組件 描述
pro_sch 網路協議, 如:http, https
net_loc 服務器所在地
path 使用/分割的路徑
params 可選引數
? 可選, 表示后面是查詢引數
query 可選, 用連接符(&)分割的一系列鍵值對, 如: user=lisi&pwd=aaa
#frag 可選, 指定檔案內特點錨的部分

5.3 urllib包和parse模塊

urllib是一個package, 這個package包含了幾個模塊, 這幾個模塊都是使用url來作業.

  1. urllib.request模塊, 用于打開和讀取url
  2. urllib.error模塊, 包含了urllib.request拋出的一些例外.
  3. urllib.parse模塊, 決議url
  4. urllib.robotparser模塊, 決議robots.txt 檔案

5.3.1 urllib

在python2中的模塊urllib, urlparse, urllib2, 以及其他內容都整合在了urllib單一包中.

  1. urllib和urllib2的內容整合在了urllib.request模塊中
  2. urlparse的內容整合在了urllib.parse模塊中
  3. urllib包還包括其他模塊如:response, error, robotparse, 后面再學習.

python支持兩種不同的模塊來處理url, 一個是parse, 另一個是request.

兩種模塊的功能不一樣, 下面會分別介紹兩個模塊.

5.3.2 parse模塊

parse是包urllib下的模塊, 只是用來處理url這個字串本身, 而不負責使用這個url去聯網獲取資源.

parse主要提供了三個功能: urlparse(), urlunparse(), urljoin()


1. parse.urlparse()

urlparse()用來將url字串決議成我們前面說的那些組件.

語法:

urlparse(urlstr, defProSch='', allowFrag=True)

**說明:

**

  1. 引數1就是url字串. 回傳值一個ParseResult型別的資料
  2. defProSch默認網路協議.
  3. allowFrag 表示url中是否允許使用片段.
from urllib.parse import *

o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
print(o)

結果:

ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')

2. parse.urlunparse()

是把各個部分組合成url字串.

from urllib.parse import *

o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
urlstr = urlunparse(o)
print(urlstr)
3. parse.urljoin()

urljoin()實作了url的連接功能.

urljoin(base, new_url, allow_fragments=True)

說明:

取得base的根路徑(不包括路徑中末端的檔案), 然后與new_url連接起來.

from urllib.parse import *

newUrl = urljoin('http://www.cwi.nl/abc/Python.html', 'FAQ.html')
print(newUrl)

5.4 request模塊

urllib.request模塊提供了許多函式, 可用于從指定URL加載資料, 同時也可以對字串進行編碼解碼作業, 以便再URL中以正確的形式顯示出來.


request.urlopen()

urlopen(url, data=https://www.cnblogs.com/yanadoude/p/None[, timeout])

說明:

  1. 該函式, 打開指定的url并回傳類檔案物件, 可使用該物件讀取回傳的資料.
  2. 對所有HTTP請求, 最常用的是GET請求, 向服務器發送的請求引數應該是url的一部分. 注意使用到的引數應該是已經經過url編碼的(使用parse.urlencode()編碼).
  3. 如果是post請求, 請求的字串(包括表單資料)應該放在第二個引數data中.
from urllib.request import *

with urlopen("http://www.yztcedu.com") as r:
    print(r)

urlopen()的回傳值類檔案物件

一旦連接成功, urlopen()會返還一個類檔案物件, 就像在目標路徑下打開了一個可讀檔案,

urlopne()類檔案物件方法 描述
f.read([bytes]) 從檔案中讀取所有或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 *

with urlopen("http://www.yztcedu.com") as r:
    for line in r.readlines():
        print(line.decode("utf-8"))

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/161032.html

標籤:Python

上一篇:Python list,tuple,dict,set高級變數常用方法

下一篇:檔案(csv/xlsx)中的資料匯入到資料庫中

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more