版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、網(wǎng)絡(luò)編程的目的是直接或間接地通過網(wǎng)絡(luò)協(xié)議與其他計算機進行通信。本章將介紹Python網(wǎng)絡(luò)通信基礎(chǔ)及其網(wǎng)絡(luò)應(yīng)用。主要介紹Python網(wǎng)絡(luò)應(yīng)用相關(guān)的主要模塊、類及其使用方法。Python支持TCP和UDP協(xié)議族。TCP用于網(wǎng)絡(luò)的可靠的流式輸入/輸出。UDP支持更簡單的、快速的、點對點的數(shù)據(jù)報模式。第12章 網(wǎng)絡(luò)與爬蟲學(xué)習(xí)重點或難點: 網(wǎng)絡(luò)通信基礎(chǔ) Socket編程 電子郵件收發(fā) 網(wǎng)絡(luò)爬蟲學(xué)習(xí)本章后將能了解到QQ、收發(fā)郵件等Internet應(yīng)用軟件的實現(xiàn)原理,并有能力自己來嘗試編寫有類似功能的網(wǎng)絡(luò)應(yīng)用軟件。第12章 網(wǎng)絡(luò)與爬蟲12.1 網(wǎng)絡(luò)基礎(chǔ)知識12.2 Socket編程12.3 電子郵件12.4
2、 urllib爬蟲模塊第12章 網(wǎng)絡(luò)與爬蟲計算機網(wǎng)絡(luò)是指通過各種通信設(shè)備連接起來的、支持特定網(wǎng)絡(luò)通信協(xié)議的、許許多多的計算機或計算機系統(tǒng)的集合。12.1 網(wǎng)絡(luò)基礎(chǔ)知識IP地址是計算機網(wǎng)絡(luò)中任意一臺計算機地址的唯一標(biāo)識。域名地址是計算機網(wǎng)絡(luò)中一臺主機的標(biāo)識名,也可以看做是IP地址的助記名。 端口是為了在一臺主機上標(biāo)識多個進程而采取的一種手段。12.1 網(wǎng)絡(luò)基礎(chǔ)知識知道了網(wǎng)絡(luò)中某一臺主機的IP地址,就可以定位這臺計算機。通過這種地址標(biāo)識,網(wǎng)絡(luò)中的計算機可以互相定位和通信。目前,IP地址有兩種格式,即IPV4格式和IPV6格式。1)IPV4是由4個字節(jié)數(shù)組成,中間以小數(shù)點分隔。譬如:。2)IPV6是
3、由16個字節(jié)組成,中間以冒號分隔。譬如:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一個合法的IPv6地址。在Internet上,一個域名地址可以有多個IP地址與之相對應(yīng),一個IP地址也可以對應(yīng)多個域名。通過主機名到IP地址的解析,可以由主機名得到對應(yīng)的IP地址。在訪問網(wǎng)上資源時,一般只需記住服務(wù)器的主機名就可以了。因為網(wǎng)絡(luò)中的域名解析服務(wù)器可以根據(jù)主機名查出對應(yīng)的IP地址。有了服務(wù)器的IP地址,就可以訪問這個網(wǎng)站了。一臺主機上允許有多個進程,這些進程都可以和網(wǎng)絡(luò)上的其他計算機進行通信。更準(zhǔn)確地說,網(wǎng)絡(luò)通信的主體不是主機,而是主機中運行的進程。主機名(或I
4、P地址)和端口的組合能唯一確定網(wǎng)絡(luò)通信的主體進程。端口(port)是網(wǎng)絡(luò)通信時同一主機上的不同進程的標(biāo)識。12.1 網(wǎng)絡(luò)基礎(chǔ)知識網(wǎng)絡(luò)編程是指編寫運行在多個設(shè)備(計算機)的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。網(wǎng)絡(luò)連接中要使用到的網(wǎng)絡(luò)協(xié)議:(1)TCP(Transfer Control Protocol的簡稱)傳輸控制協(xié)議,是一種面向連接的、可以提供可靠傳輸?shù)膮f(xié)議。使用TCP協(xié)議傳輸數(shù)據(jù),接收端得到的是一個和發(fā)送端發(fā)出的完全一樣的數(shù)據(jù)流。通常用于互聯(lián)網(wǎng)協(xié)議,被稱TCP/IP。(2)UDP(User Datagram Protocol的簡稱)用戶數(shù)據(jù)報協(xié)議,是一種無連接的協(xié)議,它傳輸?shù)氖且环N獨立的數(shù)據(jù)
5、報(Datagram)。每個數(shù)據(jù)報都是一個獨立的信息,包括完整的源地址或目的地址。12.1 網(wǎng)絡(luò)基礎(chǔ)知識TCP協(xié)議UDP協(xié)議必須建立發(fā)送方和接收方連接無大小限制有大小限制不可靠的協(xié)議無須建立發(fā)送方和接收方連接可靠的協(xié)議網(wǎng)絡(luò)程序設(shè)計技術(shù)(1)URL編程技術(shù):URL表示了Internet上某個資源的地址。通過URL標(biāo)識,可以直接使用各種通信協(xié)議獲取遠端計算機上的資源信息,方便快捷地開發(fā)Internet應(yīng)用程序。(2)TCP編程技術(shù):TCP是可靠的連接通信技術(shù),主要使用套接字(Socket)機制。TCP通信是使用TCP/IP協(xié)議、建立在穩(wěn)定連接基礎(chǔ)上的、以流傳輸數(shù)據(jù)的通信方式。(3)UDP編程技術(shù):
6、UDP是無連接的快速通信技術(shù),數(shù)據(jù)報通信不需要建立連接,通信時所傳輸?shù)臄?shù)據(jù)報能否到達目的地、到達的時間、到達的次序都不能準(zhǔn)確知道。12.1 網(wǎng)絡(luò)基礎(chǔ)知識Socket(套接字)是操作系統(tǒng)內(nèi)核中的一個數(shù)據(jù)結(jié)構(gòu),它是網(wǎng)絡(luò)中的節(jié)點進行相互通信的門戶,它是網(wǎng)絡(luò)進程的ID。網(wǎng)絡(luò)通信,歸根到底還是進程間的通信(不同計算機上的進程間通信,IP協(xié)議進行的主要是端到端通信)。Socket編程即是網(wǎng)絡(luò)中節(jié)點間基于某種協(xié)議的多進程間的交互操作編程。12.2 Socket編程1.Socket套接字的概念在網(wǎng)絡(luò)中,每一個節(jié)點(計算機或路由)都有一個網(wǎng)絡(luò)地址,也就是IP地址。兩個進程通信時,首先要確定各自所在的網(wǎng)絡(luò)節(jié)點的網(wǎng)
7、絡(luò)地址。網(wǎng)絡(luò)地址只能確定進程所在的計算機,不能確定是和網(wǎng)絡(luò)中的哪一個進程進行通信,因此套接字中還需要包括其他的信息,也就是端口號(PORT)。12.2 Socket編程在一臺計算機中,一個端口號一次只能分配給一個進程,也就是說,端口號和進程之間是一一對應(yīng)關(guān)系。所以,使用端口號和網(wǎng)絡(luò)地址的組合可以唯一的確定整個網(wǎng)絡(luò)中的一個網(wǎng)絡(luò)進程。端口號的范圍從065535,一類是由互聯(lián)網(wǎng)指派名字和號碼公司ICANN負(fù)責(zé)分配給一些常用的應(yīng)用程序固定使用的“周知的端口”,其值一般為01023,用戶自定義端口號一般大于等于1024。每一個Socket都用一個半相關(guān)描述協(xié)議、本地地址、本地端口來表示;一個完整的套接字
8、則用一個相關(guān)描述協(xié)議、本地地址、本地端口、遠程地址、遠程端口來表示。12.2 Socket編程2、Socket類型Socket類型都定義在Socket模塊中,調(diào)用方式socket.SOCK_XXXX。(1)流式Socket(SOCK_STREAM)用于TCP通信(2)數(shù)據(jù)報Socket(SOCK_DGRAM)用于UDP通信 (3)原始套接字(SOCK_RAW)用于新的網(wǎng)絡(luò)協(xié)議(ICMP、IGMP、IPv4報文等)12.2 Socket編程12.2 Socket編程import socket,os,json # 服務(wù)端程序# 客戶端請求服務(wù)端的文件,服務(wù)端確認(rèn)后將文件發(fā)送給客戶端sock = s
9、ocket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.bind(,9999)sock.listen(1)def pack_msg_header(header,header_size): # 制作文件頭部 bytes_header = bytes(json.dumps(header) ,encoding=utf-8) if len(bytes_header ) :).strip() if not cmd : continue sock.send(cmd.encode(utf-8) msg_header = sock.recv(300) # 規(guī)定頭
10、文件的長度為300 print(received:,msg_header.decode(gbk) header = json.loads(msg_header.decode(utf-8) if header.get(error): print(header.get(error)【例12-1】 基于TCP的套接字,實現(xiàn)C/S通信。12.2 Socket編程 else: filename = headerfilename; file_size = headersize f = open(filename,wb) received_size = 0 while received_size file_
11、size : if file_size - received_size :).strip() if not msg:continue udp_client.sendto(msg.encode(utf-8),ip_port) back_msg,addr=udp_client.recvfrom(1024) print(back_msg.decode(utf-8),addr)【例12-2】 基于UDP的套接字,實現(xiàn)C/S通信。UDP不需要建立連接,可以實現(xiàn)與多個客戶端同時建立連接。相比于TCP,UDP是不可靠傳輸,但是速度快。在代碼方面的區(qū)別,TCP的recv就相當(dāng)于UDP的recvfrom,TCP
12、的send就相當(dāng)于UDP的sendto,另外因為 UDP不建立連接,所以發(fā)送消息的時候需要指定ip和端口號。12.2 Socket編程1、SMTP發(fā)送郵件使用SMTP發(fā)送郵件SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。Python的smtplib提供了一種很方便的途徑發(fā)送電子郵件。它對smtp協(xié)議進行了簡單的封裝。Python創(chuàng)建 SMTP 對象語法如下:import smtplibsmtpObj = smtplib.SMTP( host , port , local_host
13、name )12.3 電子郵件參數(shù)說明:1)host:SMTP 服務(wù)器主機。你可以指定主機的ip地址或者域名如:,這個是可選參數(shù)。2)port:如果提供了host參數(shù),需要指定SMTP服務(wù)使用的端口號,一般端口號為25。3)local_hostname:如果SMTP在本機上,只需要指定服務(wù)器地址為 localhost即可。Python SMTP對象使用sendmail方法發(fā)送郵件,語法如下:SMTP.sendmail(from_addr, to_addrs, msg, mail_options, rcpt_options這里要注意第三個參數(shù)msg是字符串,表示郵件。郵件一般由標(biāo)題、發(fā)信人、收件
14、人、郵件內(nèi)容、附件等構(gòu)成,要注意msg的格式,這個格式就是smtp協(xié)議中定義的格式。12.3 電子郵件參數(shù)說明:1)from_addr:郵件發(fā)送者地址;2)to_addrs:字符串列表,郵件發(fā)送地址;3)msg:發(fā)送消息。12.3 電子郵件 import smtplibfrom email.mime.text import MIMETextfrom email.header import Header sender = ; receiver = # 替換自己的郵箱subject = python email test; smtpserver = username = ; password =
15、* # 自己郵箱的秘密msg = MIMEText(aaaaaaaaaaadbbbbbbbbbbb6666666, text, utf-8)msgSubject = Header(subject,utf-8); msgTo = receiversmtp=smtplib.SMTP(smtpserver,25)smtp.set_debuglevel(1); smtp.helo(smtpserver); smtp.ehlo(smtpserver)smtp.login(username, password)smtp.sendmail(sender, receiver, msg.as_string()s
16、mtp.quit()【例12-3】 使用Python發(fā)送郵件簡單示例。12.3 電子郵件 import smtplibfrom email.mime.text import MIMETextmailto_list=YYYYYY.com # YYY、XXX處應(yīng)改寫實際郵件相關(guān)信息mail_host=smtp.XXX.com # 設(shè)置服務(wù)器mail_user=XXX # 用戶名mail_pass=XXX # 口令 mail_postfix=XXX.com # 發(fā)件箱的后綴def send_mail(to_list,sub,content): # to_list:收件人;sub:主題;content
17、:郵件內(nèi)容 me=hello+ # 這里的hello可以任意設(shè)置 msg = MIMEText(content,_subtype=html,_charset=gb2312) #設(shè)置為html格式郵件 【例12-4】 使用Python發(fā)送HTML格式郵件的示例。使用Python發(fā)送HTML格式的郵件12.3 電子郵件msgSubject = sub # 設(shè)置主題 msgFrom = me msgTo = ;.join(to_list) try: s = smtplib.SMTP() s.connect(mail_host) # 連接smtp服務(wù)器 s.login(mail_user,mail_p
18、ass) # 登陸服務(wù)器 s.sendmail(me, to_list, msg.as_string() # 發(fā)送郵件 s.close(); return True except Exception as e: print(str(e); return Falseif _name_ = _main_: if send_mail(mailto_list,hello,什么): print(發(fā)送成功) else: print(發(fā)送失敗)【例12-4】 使用Python發(fā)送HTML格式郵件的示例。發(fā)送HTML格式的郵件不同之處就是將MIMEText中_subtype設(shè)置為html。12.3 電子郵件
19、或者也可以在消息體中指定Content-type為text/html,如下示例:import smtplibmessage = From: From Person To: To Person MIME-Version: 1.0Content-type: text/htmlSubject: SMTP HTML e-mail testThis is an e-mail message to be sent in HTML formatThis is HTML message.This is headline. try: smtpObj = smtplib.SMTP(localhost) smtpO
20、bj.sendmail(sender, receivers, message) print(Successfully sent email)except SMTPException: print(Error: unable to send email)【例12-4】 使用Python發(fā)送HTML格式郵件的示例。12.3 電子郵件【例12-5】 使用Python發(fā)送帶附件的郵件。Python發(fā)送帶附件的郵件。12.3 電子郵件【例12-4】 使用Python發(fā)送HTML格式郵件的示例。12.3 電子郵件【例12-4】 使用Python發(fā)送HTML格式郵件的示例。2 、POP3收取郵件Python
21、內(nèi)制了一個poplib模塊(實現(xiàn)POP3協(xié)議)可以直接用來收郵件。要把POP3收取的文本變成可以閱讀的郵件,還需要用email模塊提供的各種類來解析原始文本,變成可閱讀的郵件對象。所以,收取郵件分兩步:1)用poplib把郵件的原始文本下載到本地;2)用email解析原始文本,還原為郵件對象。12.3 電子郵件POP3協(xié)議:POP3全名為“Post Office Protocol - Version 3”,收取郵件最常用的協(xié)議是就是POP協(xié)議,目前版本號是3因此為POP3。12.3 電子郵件【例12-6】 Python POP3協(xié)議收取郵件。12.3 電子郵件【例12-7】 通過POP3下載郵
22、件,來獲取最新的一封郵件內(nèi)容:12.3 電子郵件resp, lines, octets = server.retr(index); # lines存儲了郵件的原始文本的每一行,可以獲得整個郵件的原始文本:print(lines); msg_content = rn.join(str(lines)msg = Parser().parsestr(msg_content) # 稍后解析出郵件,Parser()功能需要自己補充# 可以根據(jù)郵件索引號直接從服務(wù)器刪除郵件:server.dele(index)server.quit() # 關(guān)閉連接【例12-7】 通過POP3下載郵件,來獲取最新的一封郵件
23、內(nèi)容:用POP3獲取郵件其實很簡單,要獲取所有郵件,只需要循環(huán)使用retr()把每一封郵件內(nèi)容拿到即可。真正麻煩的是把郵件的原始內(nèi)容解析為可以閱讀的郵件對象。什么是爬蟲所謂爬蟲即網(wǎng)頁抓取,是請求網(wǎng)站并且提取自己所需的數(shù)據(jù)的一個過程。此過程類似于使用IE瀏覽器,把URL作為HTTP請求的內(nèi)容發(fā)送到服務(wù)器端,然后讀取服務(wù)器端的響應(yīng)資源。通過Python程序,可以向服務(wù)器發(fā)送請求,然后進行批量、大量的數(shù)據(jù)的下載并保存。12.4 urllib爬蟲模塊1 、urllib抓取網(wǎng)頁用urllib或urllib2模塊簡單抓取網(wǎng)頁12.4 urllib爬蟲模塊【例12-8】 在Python 2.x用urllib
24、2抓取指定頁面示例之一??梢源蜷_百度主頁,右擊瀏覽器中選擇查看源代碼,會發(fā)現(xiàn)也是一樣的內(nèi)容。也就是說上面這段代碼將訪問百度時瀏覽器收到的代碼全部打印了出來。這就是一個最簡單的urllib2的例子。除了“http:”,URL同樣可以使用“ftp:”、“file:”等來替代。HTTP是基于請求和應(yīng)答機制的:客戶端提出請求,服務(wù)端提供應(yīng)答。urllib2用一個Request對象來映射你提出的HTTP請求。在它最簡單的使用形式中將要請求的地址創(chuàng)建一個Request對象。通過調(diào)用urlopen并傳入Request對象,將返回一個相關(guān)請求response對象,這個應(yīng)答對象如同一個文件對象,所以可以在Res
25、ponse中調(diào)用read()讀取方法。12.4 urllib爬蟲模塊【例12-8】 在Python 2.x用urllib2抓取指定頁面示例之二??梢钥吹捷敵龅膬?nèi)容和上例urllib2_test01.py輸出內(nèi)容是一樣的。urllib2使用相同的接口處理所有的URL頭。例如:可以像下面那樣創(chuàng)建一個ftp請求:req = urllib2.Request(/)12.4 urllib爬蟲模塊【例12-10】 在Python 3.x用urllib.request抓取指定頁面之三。使用的編輯器是Idle,在源程序文件中輸入程序后,按F5就能運行并顯示結(jié)果。運行結(jié)果如圖12-1所示。圖12-1 Python
26、抓取指定頁面的程序與抓取到的內(nèi)容12.4 urllib爬蟲模塊urllib.request是一個隸屬urllib的庫。代碼中用到它的urlopen()函數(shù)。urllib.request.urlopen(url, data=None, timeout, *, cafile=None, capath=None, cadefault=False) 這個函數(shù)返回一個 http.client.HTTPResponse 對象,這個對象又有多種方法,比如read()方法,這些方法都可以在控制臺試運行。 full_url= /s?word=Python response = urllib.request.ur
27、lopen(full_url) type(response) # response.geturl() # /s?word=Python () # response.getcode() # 200 表示http狀態(tài)正常發(fā)送data表單數(shù)據(jù)并抓取網(wǎng)頁12.4 urllib爬蟲模塊【例12-11】在Python2.x用urllib2抓取指定頁面之四(POST傳送數(shù)據(jù))。如果沒有傳送data參數(shù),urllib2使用GET方式的請求。發(fā)送data表單數(shù)據(jù)并抓取網(wǎng)頁12.4 urllib爬蟲模塊【例12-12】在Python 2.x用urllib2抓取指定頁面之五(Get傳送數(shù)據(jù))。Data同樣可以通過在
28、Get請求的URL本身上面編碼來傳送這樣就實現(xiàn)了Data數(shù)據(jù)的Get傳送。發(fā)送data表單數(shù)據(jù)并抓取網(wǎng)頁12.4 urllib爬蟲模塊【例12-13】 在Python 3.x用urllib抓取指定頁面之六(Get傳送數(shù)據(jù))。用Python簡單處理URL,抓取百度上面搜索關(guān)鍵詞為Python Notes的網(wǎng)頁:data是一個字典, 然后通過urllib.parse.urlencode()來將data轉(zhuǎn)換為 word=Python+Notes的字符串,最后和url合并為full_url。設(shè)置Headers到http請求12.4 urllib爬蟲模塊import urllib, urllib2url
29、 = /user_agent = Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)headers = User-Agent : user_agent values = tn: 98741884_hao_pg; data = urllib.urlencode(values)req = urllib2.Request(url, data, headers)response = urllib2.urlopen(req)the_page = response.read(); print(the_page) # 讀取反饋的內(nèi)容并輸出【例12-14】 在Pyth
30、on 2.x用urllib2抓取指定頁面之七(把自身模擬成Internet Explorer)。對網(wǎng)頁內(nèi)容做簡單處理12.4 urllib爬蟲模塊import urllib.request, re # 抓取指定頁面之八def gethtml(url): page=urllib.request.urlopen(url); html=page.read(); return htmldef getimg(html): reg = rsrc=(.+?.jpg) pic_ext imgre = pile(reg); html=html.decode(utf-8) imglist = re.findall(imgre,html) return imglisthtml=g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版:智能交通系統(tǒng)設(shè)計與實施合同
- 2025年度環(huán)保工程合同標(biāo)的污染治理與環(huán)保設(shè)施建設(shè)3篇
- 2025年度炊事員餐飲衛(wèi)生監(jiān)督合同范本3篇
- 水泥煙囪美化施工方案
- 晶體管特性圖示儀圖示儀安全操作規(guī)程
- 小走刀搖臂鉆床安全操作規(guī)程
- 2025年上外版必修2物理下冊月考試卷含答案
- 2025年滬科版選擇性必修3生物上冊階段測試試卷含答案
- 工業(yè)級四串口服務(wù)器安全操作規(guī)程
- 2025年牛津上海版六年級英語上冊月考試卷
- 2024年保安員資格考試題目及答案(共60題)
- 急性胰腺炎的急救處理與家庭護理要點課件
- 糖尿病伴消化系統(tǒng)疾病飲食
- 2023年機械員之機械員專業(yè)管理實務(wù)題庫及參考答案(a卷)
- 班組安全培訓(xùn)試題含完整答案(各地真題)
- 《論語》中的人生智慧與自我管理學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2022版義務(wù)教育物理課程標(biāo)準(zhǔn)
- 期末測試-2024-2025學(xué)年語文四年級上冊統(tǒng)編版
- 全國國家版圖知識競賽題庫及答案(中小學(xué)組)
- 初中語文《國學(xué)經(jīng)典》校本教材
- 江西省外經(jīng)貿(mào)融資擔(dān)保有限公司招聘筆試題庫2024
評論
0/150
提交評論