Python的HTTP庫及示例
HTTP (Hyper Text Transfer Protocol )是一個客戶端和伺服器端請求和應答的標準。客戶端是終端使用者,伺服器端是網站。客戶端發起一個到伺服器上指定埠的HTTP 請求,伺服器向客戶端發回一個狀態行和響應的訊息。
可以使用下面的模組建立Internet Server :
(1 )socketserver :以socket 為基礎,建立一般性的IP Server 。
(2 )http :透過http 模組中的子模組server 和client 提供各種網路服務。
socketserver模組
socketserver 模組提供了一個架構來簡化網路(包括伺服器)的編寫工作,使用者不需要使用低階的socket 模組。
socketserver 模組包含的基本類如下:
(1 )TCPServer((hostname, port), handler) :支援TCP 的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler 是BaseRequestHandler 類的例項變數。
(2 )UDPServer((hostname, port), handler) :支援UDP 的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler 是BaseRequestHandler 類的例項變數。
(3 )UnixStreamServer((hostname, port), handler) :使用UNIX 網域socket 支援串流導向協議(stream-oriented protocol )的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler 是BaseRequestHandler 類的例項變數。
(4 )UnixDatagramServer((hostname, port), handler) :使用UNIX 網域socket 支援資料通訊協議(datagram-oriented protocol )的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler 是BaseRequestHandler 類的例項變數。
下面是socketserver 模組中類的類變數:
(1 )request_queue_size :儲存要求佇列的大小,該佇列用於傳給socket 的listen() 方法。
(2 )socket_type :返回伺服器使用的socket 型別,可以是socket.SOCK_STREAM 或socket.SOCK_DGRAM 。
下面是socketserver 模組中類的屬性與方法:
(1 )address_family :可以是socket.AF_INET 或socket.AF_UNIX 。伺服器的通訊協議群組。
(2 )fileno() :返回伺服器socket 的整數檔案描述元(integer file descriptor )。
(3 )handle_request() :建立一個處理函式類的例項變數,以及呼叫handle() 方法處理單一請求。
(4 )RequestHandlerClass :儲存使用者提供的請求處理函式類。
(5 )server_address :返回伺服器監聽用的IP 地址與通訊埠號碼。
(6 )serve_forever() :操作一個迴圈來處理無限的請求。
下面的示例演示StreamRequestHandler 類的使用。
import socketserver port = 50007 class myRequestHandler(socketserver.StreamRequestHandler): def handle(self): print ("Connection by ", self.client_address) self.wfile.write("data") s = socketserver.TCPServer(("", port), myRequestHandler) s.serve_forever()
server模組
http 模組的子模組server 提供了各種HTTP 服務,主要包括BaseHTTPServer 、CGIHTTPServer 類及SimpleHTTPServer 類。
server 模組以socketserver 模組為基礎,並且很少直接使用。server 模組定義了兩個基類來操作基本的HTTP 伺服器(網站伺服器)。
server 模組的第一個基類是HTTPServer 類,其語法如下:
class HTTPServer((hostname, port), RequestHandlerClass)
HTTPServer 類由socketserver.TCPServer 類派生。此類先建立一個HTTPServer 物件並監聽(hostname, port) ,然後使用RequestHandlerClass 來處理要求。
server 模組的第二個基類是BaseHTTPRequestHandler 類,其語法如下:
class BaseHTTPRequestHandler(request, client_address, server)
使用者必須建立一個BaseHTTPRequestHandler 類的子類來處理HTTP 請求。如果要處理GET 請求,就必須重新定義do_GET() 方法;如果要處理POST 請求,就必須重新定義do_POST() 方法。
下面是BaseHTTPRequestHandler 類的類變數:
(1 )BaseHTTPRequestHandler.server_version 。
(2 )BaseHTTPRequestHandler.sys_version 。
(3 )BaseHTTPRequestHandler.protocol_version 。
(4 )BaseHTTPRequestHandler.error_message_format 。
每一個BaseHTTPRequestHandler 類的例項變數都有以下屬性:
(1 )client_address :返回一個2 -tuple(hostname, port) ,為客戶端的地址。
(2 )command :識別請求的種類,可以是GET 、POST 等。
(3 )headers :返回一個HTTP 表頭。
(4 )path :返回請求的路徑。
(5 )request_version :返回請求的HTTP 版本字串。
(6 )rfile :包含輸入流。
(7 )wfile :包含輸出流。
每一個BaseHTTPRequestHandler 類的例項變數都有以下方法:
(1 )handle() :請求分派器。此方法會呼叫以 “do_ ” 開頭的方法,如do_GET() 、do_POST() 等。
(2 )send_error(error_code [, error_message]) :將錯誤訊號傳輸給客戶端。
(3 )send_response(response_code [, response_message]) :傳輸響應表頭。
(4 ) send_header(keyword, value) :寫入一個 MIME 表頭到輸出流,此表頭包含表頭的鍵值及其值。
(5 )end_header() :用來識別MIME 表頭的結尾。
下面的示例演示BaseHTTPRequestHandler 類的使用方法。
import http.server htmlpage = """ <html><head><title>Web Page</title></head> <body>Hello Python</body></html>""" class myHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): if self.path == "/": self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(htmlpage) else: self.send_error(404, "File not found") myServer = http.server.HTTPServer(("", 80), myHandler) myServer.serve_forever()
SimpleHTTPServer 類可以處理HTTP server 的請求,也可以處理所在目錄的檔案,即HTML 檔案。SimpleHTTPRequestHeader 類的語法格式如下:
class SimpleHTTPRequestHandler(request, (hostname, port), server)
SimpleHTTPRequestHeader 類有以下兩個屬性:
(1 )SimpleHTTPRequestHeader.server_version 。定義伺服器模組的級別
(2 ) SimpleHTTPRequestHeader.extensions_map :一個字典集,用於對映副檔名與 MIME 型別。
下面的示例演示SimpleHTTPRequestHandler 類的使用方法。
import http.server myHandler = http.server.SimpleHTTPRequestHandler myServer = http.server.HTTPServer(("", 80), myHandler) myServer.serve_forever()
CGIHTTPRequestHeader 類除了可以處理所在目錄的HTML 檔案外,還可以執行客戶端執行CGI (Common Gateway Interface )指令碼。CGIHTTPRequestHeader 類的語法格式如下:
class CGIHTTPRequestHandler(request, (hostname, port), server)
CGIHTTPRequestHeader 類的屬性cgi_directories 包含一個可以儲存CGI 指令碼的資料夾列表。
下面的示例演示CGIHTTPRequestHandler 類的使用方法。
import cgihttpserver import BaseHTTPServer class myHandler(http.server.CGIHTTPRequestHandler): cgi_directories = ["/cgi-bin"] myServer = http.server.HTTPServer(("", 80), myHandler) myServer.serve_forever()
client模組
client 模組主要處理客戶端的請求。client 模組的HTTPConnection 類建立並返回一個connection 物件。HTTPConnection 類的語法格式如下:
class HTTPConnection ([hostname [, port]])
如果引數port 沒有設定,預設值是80 。如果所有的引數都沒有設定,就必須使用connect() 方法自行連線。以下3 個HTTPConnection 類的例項變數都會連線到相同的伺服器:
import http.client h1 = http.client.HTTPConnection (") h2 = http.client.HTTPConnection (") h3 = http.client.HTTPConnection (", 80)
HTTPConnection 類的例項變數的方法如下:
(1 )endheaders() :寫入一行空白給伺服器,表示這是客戶端請求表頭的結尾。
(2 )connect([hostname [, port]]) :建立一個連線。
(3 )getresponse() :返回伺服器的狀態。
(4 )request() :向伺服器傳送請求。
(5 )putheader(header, argument1 [, ...]) :寫入客戶端請求表頭的表頭行。每一行包括header 、一個冒號(: )、一個空白及argument 。
(6 )putrequest(request, selector) :寫入客戶端請求表頭的第一行。引數 request 可以是 GET 、POST 、PUT 或HEAD ,引數selector 是要開啟的檔名稱。
(7 )send(data) :呼叫endheaders() 方法後,傳輸資料給伺服器。
下面的示例返回 檔案,並將此檔案儲存為一個新檔案。
【例13.3 】使用HTTPConnection 類(原始碼\ch13\13.3.py )。
import http.client #指定主機名稱 url = " #指定開啟的檔名稱 urlfile = "/News.html" #連線到主機 host = http.client.HTTPConnection (url) #寫入客戶端要求表頭的第一行 host.request("GET", urlfile) #獲取伺服器的響應 r1=host.getresponse() #列印伺服器返回的狀態 print(r1.status,r1.reason) #將file物件的內容存入新檔案 file = open("13.1.html", "w") #讀取網頁內容,以utf-8方式儲存 str = r1.read().decode("utf-8") #尋找文字 print(str.find("mlive")) #寫到檔案並將'xa0'替換為空字元 file.write(str.replace('\xa0','')) #關閉檔案 file.close()
儲存並執行程式,即可將 檔案的內容儲存在 13.1.html 檔案中。
本文節選自《 Python 程式設計從零開始學(影片教學版) 》,本次內容釋出,獲得作者和出版社授權。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841117/viewspace-2950712/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python的socket模組及示例Python
- python @pytest.fixture示例及用法Python
- C語言庫函式及示例C語言函式
- caffe的python介面caffemodel引數及特徵抽取示例Python特徵
- Python HTTP庫:requests快速入門PythonHTTP
- Http介面呼叫示例教程HTTP
- 【轉載】CL_HTTP_CLIENT的HTTP和SOAP用法示例HTTPclient
- Android 圖表開源庫調研及使用示例Android
- mpegts.js播放http/ts示例JSHTTP
- 使用mysql_udf與curl庫完成http_post通訊模組示例MySqlHTTP
- Python文字預處理:步驟、使用工具及示例Python
- Mac搭建appium環境及python執行程式碼示例MacAPPPython行程
- 主題:人臉檢測原理及示例(OpenCV+Python)OpenCVPython
- 多元統計之因子分析模型及Python分析示例模型Python
- Python的監控功能示例Python
- MinIO部署及示例
- QT使用 http 協議通訊的實現示例QTHTTP協議
- MySql連線資料庫常用引數及程式碼示例MySql資料庫
- Python開發常用的庫及模組!Python學習教程Python
- 00後開始學Python了,你卻原地打轉?常用的Python庫和示例送你Python
- 2.9.6 資料庫中的示例資料庫
- 安裝 Lua 的 HTTP 庫HTTP
- Python模組 adorner 的使用示例Python
- Flutter動畫及示例Flutter動畫
- Rust 運算子及示例Rust
- Aiohttp是Python的最快的非同步HTTP客戶端/伺服器庫包AIHTTPPython非同步客戶端伺服器
- du 及 df 命令的使用(附帶示例)
- 一個小而全的Python專案示例Python
- linux 環境下 elasticsearch 及 python 相關庫的使用LinuxElasticsearchPython
- 【python介面自動化】- 使用requests庫傳送http請求PythonHTTP
- sed 命令詳解及示例
- QT - QOverload說明及示例QT
- 基於圖資料庫 NebulaGraph 實現的欺詐檢測方案及程式碼示例資料庫
- go語言請求http介面示例 並解析jsonGoHTTPJSON
- Python 網路爬蟲的常用庫彙總及應用Python爬蟲
- 總結:11個Python3字典內建方法大全及示例Python
- 總結:44個Python3字串內建方法大全及示例Python字串
- JavaScript 陣列方法集合及示例!JavaScript陣列