python 如何用urllib與服務端交互(發送和接收數據)
urllib是Python3中內置的HTTP請求庫,不需要單獨安裝,官方文檔鏈接如下:https://docs.python.org/3/library/urllib.html從官方文檔可以看出,urllib包含4個模塊,如圖所示。
這4個模塊的功能描述如下:
- request:最基本的HTTP請求模塊,可以用來發送HTTP請求,並接收服務端的響應數據。這個過程就像在瀏覽器地址欄輸入URL,然後按Enter鍵一樣。
- error:異常處理模塊,如果出現請求錯誤,我們可以捕獲這些異常,然後根據實際情況,或者進行重試,或者直接忽略,或進行其他操作。
- parse:工具模塊,提供瞭很多處理URL的API,如拆分、解析、合並等。
- robotparser:主要用來識別網站的robots.txt文件,然後判斷哪些網站可以抓取,哪些網站不可以抓取。
本文主要介紹如何通過urllib發送HTTP GET請求和HTTP POST請求,並獲取相應數據。
1. 用urlopen函數發送HTTP GET請求
urllib最基本的一個功能就是向服務端發送HTTP請求,然後接收服務端返回的響應數據。這個功能隻需要通過urlopen函數就可以搞定。例如,下面的代碼向百度發送HTTP GET請求,然後輸出服務端的響應結果。
import urllib.request response=urllib.request.urlopen('https://baidu.com') # 將服務端的響應數據用utf-8解碼 print(response.read().decode('utf-8'))
運行結果如圖 所示。
我們可以看到,使用urllib與服務端交互是非常容易的,除瞭import語句外,真正與業務有關的代碼隻有2行,就完成瞭整個與服務端交互的過程。其實這個過程已經完成瞭爬蟲的第一步,就是從服務端獲取HTML代碼,然後就可以利用各種分析庫對HTML代碼進行解析,提取出我們感興趣的URL、文本、圖像等。其實urlopen函數返回的是一個對象,而read是這個對象的一個方法,可以利用type方法輸出這個對象的類型,當我們知道瞭對象類型後,就可以很容易知道這個對象中有哪些API,然後調用它們。
import urllib.request response=urllib.request.urlopen('https://baidu.com') print(type(response))
這段代碼會輸出如下的結果:
<class 'http.client.HTTPResponse'>
現在我們瞭解到,urlopen函數返回的是HTTPResponse類型的對象,主要包含read、getheader、getheaders等方法,以及msg、version、status、debuglevel、closed等屬性。下面是一個實際的案例,用來演示瞭HTTPResponse對象中主要的方法和屬性的用法。
import urllib.request # 向京東商城發送HTTP GET請求,urlopen函數即可以使用http,也可以使用https response=urllib.request.urlopen('https://www.jd.com') # 輸出urlopen函數返回值的數據類型 print('response的類型:',type(response)) # 輸出響應狀態碼、響應消息和HTTP版本 print('status:',response.status,' msg:',response.msg,' version:', response.version) # 輸出所有的響應頭信息 print('headers:',response.getheaders()) # 輸出名為Content-Type的響應頭信息 print('headers.Content-Type',response.getheader('Content-Type')) # 輸出京東商城首頁所有的HTML代碼(經過utf-8解碼) print(response.read().decode('utf-8'))
運行結果如圖所示。
2. 用urlopen函數發送HTTP POST請求
urlopen函數默認情況下發送的是HTTP GET請求,如果要發送HTTP POST請求,需要使用data命名參數,該參數是bytes類型,需要用bytes類將字符串形式的數據轉換為bytes類型。下面的例子
下面的例子向http://httpbin.org/post發送HTTP POST請求,並輸出返回結果。
import urllib.request # 將表單數據轉換為bytes類型,用utf-8編碼 data=bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding='utf-8') # 提交HTTP POST請求 response=urllib.request.urlopen('http://httpbin.org/post',data=data) # 輸出響應數據 print(response.read().decode('utf-8'))
這段代碼中一開始提供瞭一個字典形式的表單數據,然後使用urlencode方法將字典類型的表單轉換為字符串形式的表單,接下來將字符串形式的表單按utf-8編碼轉換為bytes類型,這就是要傳給urlopen函數的data命名參數的值,要註意,一旦指定瞭data命名參數,urlopen函數就會向服務端提交HTTP POST請求,這裡並不需要顯式指定要提交的是POST請求。
本例將HTTP POST請求提交給瞭http://httpbin.org/post,這是一個用於測試HTTP POST請求的網址,如果請求成功,服務端會將HTTP POST請求信息原封不動地返回給客戶端。運行結果如圖所示。
以上就是python 如何用urllib與服務端交互(發送和接收數據)的詳細內容,更多關於python 用urllib與服務端交互的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python爬蟲之urllib庫詳解
- python urllib.request模塊的使用詳解
- 關於python爬蟲應用urllib庫作用分析
- Python urllib 入門使用詳細教程
- Python爬蟲中urllib3與urllib的區別是什麼