python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))
urllib是Python3中內(nèi)置的HTTP請(qǐng)求庫(kù),不需要單獨(dú)安裝,官方文檔鏈接如下:https://docs.python.org/3/library/urllib.html從官方文檔可以看出,urllib包含4個(gè)模塊,如圖所示。

這4個(gè)模塊的功能描述如下:
- request:最基本的HTTP請(qǐng)求模塊,可以用來(lái)發(fā)送HTTP請(qǐng)求,并接收服務(wù)端的響應(yīng)數(shù)據(jù)。這個(gè)過(guò)程就像在瀏覽器地址欄輸入U(xiǎn)RL,然后按Enter鍵一樣。
- error:異常處理模塊,如果出現(xiàn)請(qǐng)求錯(cuò)誤,我們可以捕獲這些異常,然后根據(jù)實(shí)際情況,或者進(jìn)行重試,或者直接忽略,或進(jìn)行其他操作。
- parse:工具模塊,提供了很多處理URL的API,如拆分、解析、合并等。
- robotparser:主要用來(lái)識(shí)別網(wǎng)站的robots.txt文件,然后判斷哪些網(wǎng)站可以抓取,哪些網(wǎng)站不可以抓取。
本文主要介紹如何通過(guò)urllib發(fā)送HTTP GET請(qǐng)求和HTTP POST請(qǐng)求,并獲取相應(yīng)數(shù)據(jù)。
1. 用urlopen函數(shù)發(fā)送HTTP GET請(qǐng)求
urllib最基本的一個(gè)功能就是向服務(wù)端發(fā)送HTTP請(qǐng)求,然后接收服務(wù)端返回的響應(yīng)數(shù)據(jù)。這個(gè)功能只需要通過(guò)urlopen函數(shù)就可以搞定。例如,下面的代碼向百度發(fā)送HTTP GET請(qǐng)求,然后輸出服務(wù)端的響應(yīng)結(jié)果。
import urllib.request
response=urllib.request.urlopen('https://baidu.com')
# 將服務(wù)端的響應(yīng)數(shù)據(jù)用utf-8解碼
print(response.read().decode('utf-8'))
運(yùn)行結(jié)果如圖 所示。

我們可以看到,使用urllib與服務(wù)端交互是非常容易的,除了import語(yǔ)句外,真正與業(yè)務(wù)有關(guān)的代碼只有2行,就完成了整個(gè)與服務(wù)端交互的過(guò)程。其實(shí)這個(gè)過(guò)程已經(jīng)完成了爬蟲的第一步,就是從服務(wù)端獲取HTML代碼,然后就可以利用各種分析庫(kù)對(duì)HTML代碼進(jìn)行解析,提取出我們感興趣的URL、文本、圖像等。其實(shí)urlopen函數(shù)返回的是一個(gè)對(duì)象,而read是這個(gè)對(duì)象的一個(gè)方法,可以利用type方法輸出這個(gè)對(duì)象的類型,當(dāng)我們知道了對(duì)象類型后,就可以很容易知道這個(gè)對(duì)象中有哪些API,然后調(diào)用它們。
import urllib.request
response=urllib.request.urlopen('https://baidu.com')
print(type(response))
這段代碼會(huì)輸出如下的結(jié)果:
<class 'http.client.HTTPResponse'>
現(xiàn)在我們了解到,urlopen函數(shù)返回的是HTTPResponse類型的對(duì)象,主要包含read、getheader、getheaders等方法,以及msg、version、status、debuglevel、closed等屬性。下面是一個(gè)實(shí)際的案例,用來(lái)演示了HTTPResponse對(duì)象中主要的方法和屬性的用法。
import urllib.request
# 向京東商城發(fā)送HTTP GET請(qǐng)求,urlopen函數(shù)即可以使用http,也可以使用https
response=urllib.request.urlopen('https://www.jd.com')
# 輸出urlopen函數(shù)返回值的數(shù)據(jù)類型
print('response的類型:',type(response))
# 輸出響應(yīng)狀態(tài)碼、響應(yīng)消息和HTTP版本
print('status:',response.status,' msg:',response.msg,' version:', response.version)
# 輸出所有的響應(yīng)頭信息
print('headers:',response.getheaders())
# 輸出名為Content-Type的響應(yīng)頭信息
print('headers.Content-Type',response.getheader('Content-Type'))
# 輸出京東商城首頁(yè)所有的HTML代碼(經(jīng)過(guò)utf-8解碼)
print(response.read().decode('utf-8'))
運(yùn)行結(jié)果如圖所示。

2. 用urlopen函數(shù)發(fā)送HTTP POST請(qǐng)求
urlopen函數(shù)默認(rèn)情況下發(fā)送的是HTTP GET請(qǐng)求,如果要發(fā)送HTTP POST請(qǐng)求,需要使用data命名參數(shù),該參數(shù)是bytes類型,需要用bytes類將字符串形式的數(shù)據(jù)轉(zhuǎn)換為bytes類型。下面的例子
下面的例子向http://httpbin.org/post發(fā)送HTTP POST請(qǐng)求,并輸出返回結(jié)果。
import urllib.request
# 將表單數(shù)據(jù)轉(zhuǎn)換為bytes類型,用utf-8編碼
data=bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding='utf-8')
# 提交HTTP POST請(qǐng)求
response=urllib.request.urlopen('http://httpbin.org/post',data=data)
# 輸出響應(yīng)數(shù)據(jù)
print(response.read().decode('utf-8'))
這段代碼中一開(kāi)始提供了一個(gè)字典形式的表單數(shù)據(jù),然后使用urlencode方法將字典類型的表單轉(zhuǎn)換為字符串形式的表單,接下來(lái)將字符串形式的表單按utf-8編碼轉(zhuǎn)換為bytes類型,這就是要傳給urlopen函數(shù)的data命名參數(shù)的值,要注意,一旦指定了data命名參數(shù),urlopen函數(shù)就會(huì)向服務(wù)端提交HTTP POST請(qǐng)求,這里并不需要顯式指定要提交的是POST請(qǐng)求。
本例將HTTP POST請(qǐng)求提交給了http://httpbin.org/post,這是一個(gè)用于測(cè)試HTTP POST請(qǐng)求的網(wǎng)址,如果請(qǐng)求成功,服務(wù)端會(huì)將HTTP POST請(qǐng)求信息原封不動(dòng)地返回給客戶端。運(yùn)行結(jié)果如圖所示。

以上就是python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))的詳細(xì)內(nèi)容,更多關(guān)于python 用urllib與服務(wù)端交互的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python中高效的json對(duì)比庫(kù)deepdiff詳解
- python處理json文件的四個(gè)常用函數(shù)
- 使用python如何提取JSON數(shù)據(jù)指定內(nèi)容
- python如何讀取和存儲(chǔ)dict()與.json格式文件
- 利用python實(shí)現(xiàn)JSON文檔與Python對(duì)象互相轉(zhuǎn)換
- python+html實(shí)現(xiàn)前后端數(shù)據(jù)交互界面顯示的全過(guò)程
- python tkinter與Mysql數(shù)據(jù)庫(kù)交互實(shí)現(xiàn)賬號(hào)登陸
- Python與數(shù)據(jù)庫(kù)的交互問(wèn)題小結(jié)
- python實(shí)現(xiàn)與Oracle數(shù)據(jù)庫(kù)交互操作示例
- python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5中QWebEngineView內(nèi)嵌網(wǎng)頁(yè)與Python的數(shù)據(jù)交互傳參詳細(xì)方法實(shí)例
- python與json數(shù)據(jù)的交互詳情
相關(guān)文章
在Django的視圖中使用數(shù)據(jù)庫(kù)查詢的方法
這篇文章主要介紹了在Django的視圖中使用數(shù)據(jù)庫(kù)查詢的方法,是Python的Django框架使用的基礎(chǔ)操作,需要的朋友可以參考下2015-07-07
Python實(shí)現(xiàn)RGB與HSI顏色空間的互換方式
今天小編就為大家分享一篇Python實(shí)現(xiàn)RGB與HSI顏色空間的互換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
使用Python實(shí)現(xiàn)PDF與SVG互轉(zhuǎn)
SVG(可縮放矢量圖形)和PDF(便攜式文檔格式)是兩種常見(jiàn)且廣泛使用的文件格式,本文將詳細(xì)介紹如何使用?Python?實(shí)現(xiàn)?SVG?和?PDF?之間的相互轉(zhuǎn)換,感興趣的可以了解下2025-02-02
Python 中PyQt5 點(diǎn)擊主窗口彈出另一個(gè)窗口的實(shí)現(xiàn)方法
這篇文章主要介紹了Python 中PyQt5 點(diǎn)擊主窗口彈出另一個(gè)窗口的實(shí)現(xiàn)方法,本文代碼實(shí)例圖文相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
python二維碼操作:對(duì)QRCode和MyQR入門詳解
今天小編就為大家分享一篇python二維碼操作:對(duì)QRCode和MyQR入門詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python實(shí)現(xiàn)繁體中文與簡(jiǎn)體中文相互轉(zhuǎn)換的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)繁體中文與簡(jiǎn)體中文相互轉(zhuǎn)換的方法,涉及Python基于第三方模塊進(jìn)行編碼轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-12-12

