Python網絡編程的應用與網頁數據的處理

(一)網絡概要

網絡系統(network system)是使用OSI/ISO(Open Systems Interconnection/International Standards Organization),國際標準化組織制定的開放系統互連七層模型(seven-layer model)來定義。這七層模型代表七層的網絡進程:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,以及應用層。
現在的網絡協議(包括TCP/IP)實際上會使用較少的層數,而不是OSI定義的完整層數。所以當想要將TCP/IP會話映射到OSI模型時,常會弄不清楚發生什麼問題。因爲有些層已經合併,有些則是已經刪除。

(二)socket模塊

1.認識socket模塊
socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間可以通訊。socket模塊提供了標準的網絡接口,可以訪問底層操作系統socket接口的全部方法。
Python使用socket()函數來創建套接字,語法格式如下:
socket.socket([family[, type[, protocol]]])

2.創建socket連接
使用socket模塊的socket函數來創建一個socket對象。
socket對象可以通過調用其他函數來設置一個socket服務。
通過調用 bind(hostname, port) 函數來指定服務的port(端口)。
然後調用socket對象的accept 方法。
該方法等待客戶端的連接,並返回connection對象,表示已連接到客戶端。

(三)HTTP庫

1.socketserver模塊
socketserver模塊提供一個架構,來簡化網絡服務器的編寫工作。
用戶不需要使用低級的socket模塊,socketserver模塊提供四個基本的server類:TCPServer,UDPServer,StreamRequestHandler以及DatagramRequestHandler。這些類處理同步的要求,每一個請求都必須在下一個請求開始前完成。但是如果是客戶端需要長時間的計算,這些類就不適合。
爲了以個別的線程來處理要求,可以使用下列類:ThreadingTCPServer,ThreadingUDPServer,ForkingTCPServer以及ForkingUDPServer。
StreamRequestHandler與DatagramRequestHandler類提供兩個屬性:self.rfile與self.wfile,可以用來在客戶端應用程序讀/寫數據。

2.server模塊
http模塊的子模塊server提供各種HTTP服務。
主要包括BaseHTTPServer類、CGIHTTPServer類與SimpleHTTPServer類。
server模塊定義兩個基類,來操作基本的HTTP服務器(也稱爲網站服務器)。此模塊以socketserver模塊爲基礎,並且很少直接使用。
server模塊的第一個基類是HTTPServer類,其語法爲:
class HTTPServer((hostname, port), RequestHandlerClass)
HTTPServer類由socketserver.TCPServer類派生。此類創建一個HTTPServer對象,並且監聽(hostname, port),然後使用RequestHandlerClass來處理要求。

3.client模塊
client模塊主要處理客戶端的請求。client模塊的HTTPConnection類創建並且返回一個connection對象。HTTPConnection類的語法如下:
class HTTPConnection ([hostname [, port]])
如果沒有設置參數port,默認值是80。如果所有的參數都沒有設置,必須使用connect()方法來自行連接。

(四)urllib庫

1.request模塊
request模塊是使用socket來讀取網絡數據的接口,支持HTTP,FTP,以及gopher等連接。
要讀取一個網頁文件,可以使用urlopen()方法。語法如下:
urllib.request.urlopen(url [, data])
其中參數url是一個URL字符串;參數data用來指定一個GET請求。

2.parse模塊
parse模塊解析URL字符串,並且返回一個元組:(addressing scheme, netword location, path, parameters, query, fragment identifier)。parse模塊可以將URL分解成數個部分,然後再組合回來,並且可以將相對地址轉換成絕對地址。

(五)ftplib模塊

FTP(File Transfer Protocol)是一種在網絡上傳輸文件的普遍方式,因爲在大部分的操作系統上都有客戶端的FTP與服務器端的FTP服務。服務器端的FTP可以同時使用在私有(private)的用戶,與匿名(anonymous)的用戶。
私有的服務器端FTP只允許系統用戶來連接,匿名的服務器端FTP則允許不需帳號即可以連接網絡來傳輸文件。使用匿名的服務器端FTP,會產生安全性的問題。
FTP提供一個控制端口與一個數據端口,在服務器端與客戶端之間的數據傳輸使用獨立的socket,以避免死機的問題。
Python中默認安裝的ftplib模塊定義了FTP類,可用來創建一個FTP連接,用於上傳或下載文件。FTP類的語法如下所示:
class FTP([host [, user [, passwd [, acct]]]])
其中host是主機名稱,user是用戶帳號,passwd是用戶密碼。

(六)電子郵件服務協議

1.smptlib模塊
Python的smptlib模塊提供SMTP協議的客戶端接口,用來傳輸電子郵件到網絡上的其他機器。
smptlib模塊定義一個SMTP類,用來創建一個SMTP連接。
SMTP類的語法如下所示:
class SMTP([host [, port]])
其中參數host是主機名稱。下列是SMTP類的實例變量的方法列表:
⑴ connect(host [, port]):連接到(host, port),port的默認值是25。
⑵ sendmail(from_addr, to_addrs, msg [, mail_options, rcpt_options]):送出電子郵件。from_addr是RFC 822 from-address字符串,to_addr是RFC 822 to-address字符串。msg是一個信息字符串。
⑶ quit():結束SMTP連接。

2.poplib模塊
Python的poplib模塊提供POP3協議的客戶端接口,用來從網絡上接收電子郵件。
poplib模塊定義一個POP3類,用來創建一個POP3連接。
POP3類的語法如下所示:
class POP3([host [, port]])
其中host是主機名稱,port的默認值是110。

3.imaplib模塊
Python的imaplib模塊提供IMAP協議的客戶端接口。imaplib模塊定義一個IMAP4類,用來創建一個IMAP連接。IMAP4類的語法如下所示:
class IMAP4([host [, port]])
其中host是主機名稱,port的默認值是143。
下列是IMAP4類的實例變量的方法列表:
⑴ fetch(message_set, message_parts):取出信息。
⑵ login(user, password):登錄IMAP4服務器。
⑶ logout():註銷IMAP4服務器,關閉連接。
⑷ search(charset, criterium [, …]):搜索郵件信箱找出符合的信息。
⑸ select([mailbox [, readonly]]):選擇一個郵件信箱。

(七)新聞羣組

nntplib模塊提供客戶端的NNTP協議的接口,NNTP(Network News Transfer Protocol)是一個提供新聞羣組(newsgroup)的服務。NNTP協議使用ASCII文字,在客戶端與服務器端之間傳輸數據,同時也用來交換服務器間的新聞稿。
nntplib模塊定義一個NNTP類,用來創建一個NNTP連接。
NNTP類的語法如下所示:
class NNTP(host [, port [, user [, password [, readermode]]]])
其中host是主機名稱,port的默認值是119。

(八)遠程連接計算機

telnetlib模塊提供客戶端的Telnet協議的服務,Telnet協議用來連接遠程的計算機,通常使用通信端口23。創建好Telnet連接後,就可以通過Telnet接口在遠程的計算機上執行命令。
telnetlib模塊定義一個Telnet類,用來創建一個Telnet連接。
Telnet類的語法規則如下所示:
class Telnet([host [, port]])
其中host是主機名稱,port的默認值是23。

網頁數據的處理

Python解析XML

1.使用SAX解析XML
python標準庫包含(simple API for XML )SAX解析器,SAX是一種基於事件驅動的API,通過在解析XML的過程中觸發一個個的事件,然後調用用戶定義的回調函數來處理XML文件。
使用SAX解析XML文檔主要包括兩部分:解析器和事件處理器。其中解析器負責讀取XML文檔,並向事件處理器發送事件,如元素開始跟元素結束事件;而事件處理器則負責調出相應的事件,對傳遞的XML數據進行處理。

2.使用DOM解析XML
文件對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴展置標語言的標準編程接口。DOM將XML數據在內存中解析成一個樹,通過對樹的操作來操作XML。
一個DOM的解析器在解析一個XML文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內存中的一個樹結構裏,之後可以利用DOM提供的不同的函數來讀取或修改文檔的內容和結構,也可以把修改過的內容寫入xml文件。

XDR數據交換格式

XDR(eXternal Data Representation,外部數據表示)是數據描述與編碼的標準,它使用隱含形態的語言來正確地描述複雜的數據格式。SunRPC(Remote Procedure Call,遠程過程調用)與NFS(Network File System,網絡文件系統)等協議,都使用XDR來描述它們的數據格式,因爲XDR適合在不同的計算機結構之間傳輸數據。
Python語言通過提供的xdrlib模塊來處理XDR數據,在網絡應用程序上的應用非常廣泛。xdrlib模塊定義中定義了Packer類和Unpacker類,另外還定義了兩個異常。

  1. Packer類
  2. Unpacker類
JSON數據解析

JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。Python中提供了json模塊來對JSON 數據進行編碼和解碼。json模塊中包含了以下兩個函數:
⑴ json.dumps(): 對數據進行編碼。
⑵ json.loads(): 對數據進行解碼。

Python解析HTML

Python使用urllib包抓取網頁後,需要將抓取到的數據交給HTMLParser解析,從而提取出需要的內容。Python提供了一個簡單的解析模塊HTMLParser類,使用起來也是比較簡單,特別是新手用起來比較容易。
HtmlParser是一個類,在使用時一般繼承它然後重載它的方法,來達到解析出需要的數據的目的。HtmlParser類的常用方法如下:

  • ⑴ handle_starttag(tag, attrs) :處理開始標籤,比如 < div >;這裏的attrs獲取到的是屬性列表,屬性以元組的方式展示。
  • ⑵ handle_endtag(tag): 處理結束標籤,比如< /div >。
  • ⑶ handle_startendtag(tag, attrs):處理自己結束的標籤,如< img />。
  • ⑷ handle_data(data) :處理數據。例如標籤之間的文本。
  • ⑸ handle_comment(data):處理註釋。例如< !-- -->之間的文本。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章