Python是一個(gè)很強(qiáng)大的網(wǎng)絡(luò)編程工具
一光坝、python內(nèi)有很多針對(duì)常見網(wǎng)絡(luò)協(xié)議的庫(kù),對(duì)網(wǎng)絡(luò)協(xié)議的各個(gè)層次進(jìn)行了抽象封裝洲赵,因此使用python編寫程序不必關(guān)心網(wǎng)絡(luò)實(shí)現(xiàn)的細(xì)節(jié)
二叠萍、python非常善于處理字節(jié)流的各種模式苛谷,使用python可以很容易地寫出處理各種協(xié)議格式的代碼
(1)urllib和urllib2
互聯(lián)網(wǎng)基本原理是基于“請(qǐng)求-響應(yīng)”模式腹殿,獲取互聯(lián)網(wǎng)上的資源需要發(fā)出請(qǐng)求,即URL? (地址)
Python中實(shí)現(xiàn)的urllib和urllib2刻炒,功能很強(qiáng)大坟奥,通過它們?cè)L問網(wǎng)絡(luò)上的文件爱谁,就像訪問本地電腦的文件一樣兩個(gè)模塊的功能都差不多访敌,但urllib2更好一些:
如果只需要簡(jiǎn)單的下載邪媳,使用urllib就能夠滿足要求如果需要使用HTTP驗(yàn)證或cookie或要為自己的協(xié)議編寫擴(kuò)展程序的話雨效,urllib2是更好的選擇
使用urllib.request模塊下載文件,使用urlretrieve()方法
語(yǔ)法:
urlretrieve(url,[filename,reporthook])
參數(shù)url代表資源路徑
參數(shù)filename指定本地保存路徑
參數(shù)reporthook是一個(gè)回調(diào)函數(shù)叮姑,當(dāng)連接上服務(wù)器传透、以及相應(yīng)的數(shù)據(jù)庫(kù)傳輸完畢時(shí)會(huì)觸發(fā)回調(diào)极颓,可以利用來顯示下載進(jìn)度
使用urllib2可以像打開本地文件一樣打開遠(yuǎn)程文件菠隆,不同之處是只能使用只讀模式
打開遠(yuǎn)程文件使用的方法是urlopen(),傳遞給它的參數(shù)是URL
urlopen()返回一個(gè)能從中讀取數(shù)據(jù)的類文件對(duì)象躯肌,支持多種方法:read清女、readline嫡丙、readlines、close
練習(xí):根據(jù)中國(guó)天氣網(wǎng)(www.weather.com.cn)提供的查詢接口來獲取天氣信息
例子:http://www.weather.com.cn/data/cityinfo/101010100.html 查詢北京市天氣信息
中國(guó)天氣網(wǎng)城市代碼:
利用中國(guó)天氣網(wǎng)提供的接口,能夠獲取到對(duì)應(yīng)城市的天氣信息
獲取到的信息結(jié)構(gòu)類似一個(gè)有兩層的字典
最外層只有一個(gè)鍵“weatherinfo”,它的值是另外一個(gè)字典尘吗,里面包含了很多天氣信息
這種數(shù)據(jù)結(jié)構(gòu)被稱為“json格式”
Json是一種輕量級(jí)的數(shù)據(jù)交換格式,是一種完全獨(dú)立于語(yǔ)言的文本格式黔宛,但是也使用了類似于C語(yǔ)言家族的習(xí)慣(包括C臀晃、C++徽惋、C#险绘、Java宦棺、Python等)代咸,這些特性使json成為了理想的數(shù)據(jù)交換語(yǔ)言
Python標(biāo)準(zhǔn)庫(kù)中也包含了json模塊侣背,模塊中的一些方法能幫助更好的處理這種json格式的數(shù)據(jù),例如通過loads方法就能將json數(shù)據(jù)轉(zhuǎn)換成真正的字典
(2)socket
套接字(socket)是網(wǎng)絡(luò)編程中的一個(gè)基本組件,是兩個(gè)端點(diǎn)的程序之間的“信息通道”
套接字包括兩個(gè):服務(wù)器套接字和客戶端套接字
無論是服務(wù)器還是客戶端潮太,都首先需要調(diào)用socket模塊中的socket()方法來創(chuàng)建socket對(duì)象
socket()方法的格式:socket(family铡买,type)
Family 參數(shù)代表地址家族霎箍,可以是AF_INET或AF_UNIX漂坏,AF_INET 代表IPv4地址谷徙,AF_UNIX只能用于單一的Unix系統(tǒng)進(jìn)程間通信
type參數(shù)代表套接字類型完慧,可以是SOCK_STREAM或SOCK_DGRAM剩失,SOCK_STREAM代表流套接字拴孤,應(yīng)用于TCP涨椒,SOCK_DGRAM代表數(shù)據(jù)報(bào)套接字绽媒,應(yīng)用于UDP
流套接字和數(shù)據(jù)報(bào)套接字的區(qū)別:
1、流套接字區(qū)分服務(wù)器和客戶端囤热,數(shù)據(jù)報(bào)套接字不區(qū)分
2旁蔼、流套接字適合傳輸數(shù)據(jù)量大的棺聊,數(shù)據(jù)報(bào)套接字適合傳輸數(shù)據(jù)量小的
3、客戶的流套接字單向傳遞限佩,數(shù)據(jù)報(bào)套接字可以接收任何方向的數(shù)據(jù)葵诈,并可以向任何地址發(fā)送數(shù)據(jù)報(bào)
4、流套接字使用時(shí)不需考慮底層細(xì)節(jié)祟同,依靠TCP協(xié)議進(jìn)行可靠的數(shù)據(jù)傳輸數(shù)據(jù)報(bào)套接字依靠UDP協(xié)議作喘,數(shù)據(jù)傳輸效率高,但需要考慮底層細(xì)節(jié)晕城,在代碼中保證數(shù)據(jù)的可靠傳輸
5泞坦、流套接字依靠TCP協(xié)議建立好連接后發(fā)送數(shù)據(jù),不需要指定地址數(shù)據(jù)報(bào)套接字依靠UDP協(xié)議發(fā)送數(shù)據(jù)砖顷,每次都需要指定發(fā)送給誰(shuí)
?服務(wù)器socket函數(shù):
bind(address)方法將套接字綁定到地址贰锁,參數(shù)address以元組(host,port)的形似表示地址
listen(backlog)方法開始監(jiān)聽TCP傳入連接择吊,參數(shù)backlog為操作系統(tǒng)可以掛起的最大連接數(shù)李根,至少為1-5
accept()方法接收TCP連接并返回元組(conn囱持,address),conn是新的socket對(duì)象掩幢,服務(wù)器必須通過它與客戶通信世曾,address是客戶的地址
客戶端socket函數(shù):
connect(address)方法連接到指定地址的套接字,參數(shù)address格式為元組(host,port)地址
connect_ex(address)方法與connect()方法相同,但是成功返回0,失敗返回errno
公共socket函數(shù):
recv(bufsize)接收TCP數(shù)據(jù)京办,參數(shù)bufsize指定接收的最大數(shù)據(jù)量,結(jié)果以字符串形式返回
send(string)發(fā)送TCP數(shù)據(jù),參數(shù)string是字符串,返回值是要發(fā)送的數(shù)據(jù)量
sendall(string)完整發(fā)送TCP數(shù)據(jù),在返回之前會(huì)嘗試發(fā)送所有數(shù)據(jù)
recvfrom(bufsize)接收UDP數(shù)據(jù),返回值是(data,address),address指明發(fā)送方地址
sendto(string,address)發(fā)送UDP數(shù)據(jù),參數(shù)中也需指明address(接收方地址)
settimeout(timeout)設(shè)置套接字操作的超時(shí)時(shí)間,參數(shù)timeout是浮點(diǎn)數(shù)炫狱,單位為秒
close()關(guān)閉套接字
編寫服務(wù)端socket思路:
1、創(chuàng)建套接字,綁定套接字到本地IP和端口
2、開始監(jiān)聽連接
3、進(jìn)入循環(huán),不斷接收客戶端的請(qǐng)求
4、接收傳來的數(shù)據(jù)布讹,并發(fā)送給對(duì)方數(shù)據(jù)
5膘流、傳輸完畢后,關(guān)閉套接字
編寫客戶端socket思路:
1考润、創(chuàng)建套接字罚舱,連接服務(wù)器地址
2阿逃、連接后發(fā)送和接收數(shù)據(jù)
3肪跋、傳輸完畢后州既,關(guān)閉套接字