引言
urllib
是Python標準庫中的一個模塊,它提供了一系列用于操作URL的功能
requests
是一個Python第三方庫,由Kenneth Reitz創建,用于簡化HTTP客戶端的編程
一、urllib
的定義
urllib
可以操作url,主要分為以下幾個子模塊:
1.1 urllib.request
用于打開和讀取URLs
1.2 urllib.error
包含urllib.request
引發的異常
1.3 urllib.parse
用于解析URLs
1.4 urllib.robotparser
用于解析robots.txt
文件
二、urllib
的特點
2.1 內置
urllib
是Python標準庫的一部分,因此不需要額外安裝
2.2 功能全面
支持多種網絡協議,包括HTTP、HTTPS、FTP等
2.3 易于使用
提供了簡單易用的API,適合進行簡單的網絡請求操作
三、urllib
的功能
3.1 打開URLs
使用urllib.request.urlopen()
函數可以輕松打開一個URL
3.2 發送請求
支持發送GET、POST等HTTP請求
3.3 處理異常
urllib.error
模塊可以捕獲和處理網絡請求過程中出現的異常
3.4 解析URLs
urllib.parse
模塊可以解析和構造URLs
3.5 遵守robots.txt
urllib.robotparser
模塊可以幫助遵守網站的爬蟲訪問規則
四、urllib
的代碼示例
以下是使用urllib
模塊進行網絡請求的幾個示例:
4.1 發送GET請求
import urllib.request
# 發送GET請求
with urllib.request.urlopen('http://www.example.com') as response:html = response.read()print(html.decode('utf-8'))
4.2 發送POST請求
import urllib.request
import urllib.parse
url = 'http://httpbin.org/post'
values = {'key': 'value'}
data = urllib.parse.urlencode(values)
data = data.encode('utf-8') # data should be bytes
req = urllib.request.Request(url, data=data, method='POST')
with urllib.request.urlopen(req) as response:print(response.read().decode('utf-8'))
4.3 處理異常
import urllib.request
import urllib.error
try:response = urllib.request.urlopen('http://www.example.com/404')
except urllib.error.HTTPError as e:print(f'HTTPError: {e.code} {e.reason}')
except urllib.error.URLError as e:print(f'URLError: {e.reason}')
4.4 解析URLs
from urllib.parse import urlparse
result = urlparse('http://www.example.com/index.html;user?id=5#comment')
print(result)
# 輸出:ParseResult(scheme='http', netloc='www.example.com', path='/index.html', params='user', query='id=5', fragment='comment')
以上示例展示了urllib
庫的一些基本用法,包括如何發送HTTP請求、如何處理請求異常以及如何解析URLs。由于urllib
庫功能豐富,這些示例只是冰山一角。
五、requests
的定義
requests
是基于urllib3
,提供了一個更加用戶友好的API來發送HTTP/1.1請求
六、requests
的特點
6.1 簡潔易用
requests
的API設計簡潔直觀,易于上手和使用
6.2 功能豐富
支持HTTP連接保持和連接池,支持SSL/TLS驗證,支持國際化和本地化等
6.3 無需手動處理編碼
自動處理HTTP響應內容的編碼問題
6.4 支持會話與 cookies
能夠使用會話對象來跨請求保持某些參數,如cookies
6.5 支持插件
requests
支持插件,可以輕松擴展其功能
七、requests
的功能
7.1 發送各種HTTP請求(GET, POST, PUT, DELETE, HEAD, OPTIONS等)
7.2 處理請求參數、URL、頭信息和內容數據
7.3 處理HTTP響應內容,包括JSON、XML、HTML等
7.4 使用會話對象來跨請求保持某些參數
7.5 上傳文件
7.6 處理SSL證書驗證
7.7 設置代理
7.8 異常處理
八、requests
的安裝
8.1 requests
不是Python標準庫的一部分,需要通過以下命令安裝:
pip install requests
8.2 若是在pycharm中則按下圖所示操作:
九、requests
的代碼示例
以下是使用requests
庫進行網絡請求的幾個示例:
9.1 發送GET請求
import requests
response = requests.get('https://api.github.com/user', params={'username': 'example'})
print(response.json())
9.2 發送POST請求
import requests
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://httpbin.org/post', data=data)
print(response.text)
9.3 使用會話對象
import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
response = s.get("http://httpbin.org/cookies")
print(response.text)
9.4 異常處理
import requests
from requests.exceptions import HTTPError, ConnectionError, Timeout, RequestException
try:response = requests.get('https://api.github.com', timeout=5)response.raise_for_status()
except HTTPError as http_err:print(f'HTTP error occurred: {http_err}')
except ConnectionError as conn_err:print(f'Connection error occurred: {conn_err}')
except Timeout as timeout_err:print(f'Timeout error occurred: {timeout_err}')
except RequestException as req_err:print(f'Oh no, something bad happened: {req_err}')
9.5 上傳文件
import requests
files = {'file': open('report.xls', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.text)
這些示例展示了requests
庫的幾個核心功能
- 發送請求
- 處理響應
- 使用會話
- 異常處理
- 上傳文件
requests
庫因其簡潔和強大而成為Python中處理HTTP請求的常用庫
十、urllib
和requests
的區別
urllib
和requests
都是Python中用于發送HTTP請求的庫,但它們在API設計、易用性、功能性和社區支持等方面存在一些顯著的區別
10.1 API設計和易用性
- urllib:
- 作為Python標準庫的一部分,無需額外安裝
- 提供了較低級別的API,使用起來較為復雜,需要編寫更多的代碼來完成相同的任務
- 異常處理較為分散,需要分別捕獲不同類型的異常
- requests:
- 需要單獨安裝,不是Python標準庫的一部分
- 提供了簡潔、直觀的API,使得發送請求和處理響應變得極其簡單
- 異常處理更加統一,通過
requests.exceptions
模塊來捕獲和處理各種異常
10.2 功能性
- urllib:
- 功能相對基礎,適合進行簡單的請求
- 對于復雜的任務,如會話保持、cookie處理、SSL驗證等,需要更多的手動操作
- requests:
- 功能更加全面,內置了會話對象、cookie持久化、SSL驗證、連接池、JSON響應解析等高級功能
- 支持插件,可以輕松擴展其功能
10.3 社區支持
- urllib:
- 作為標準庫的一部分,更新周期與Python相同,通常較為穩定
- 社區支持主要通過Python官方渠道
- requests:
- 社區驅動,更新頻繁,社區支持廣泛
- 由于是第三方庫,可能包含更多最新的特性和改進
10.4 性能
- urllib:
- 對于簡單的請求,性能通常足夠
- 對于復雜的請求或并發操作,可能需要額外的庫(如
http.client
)來優化
- requests:
- 內部使用了
urllib3
,因此在性能上有所優化,尤其是在并發請求時
- 內部使用了
示例對比
以下是使用urllib
和requests
發送GET請求的簡單示例對比:
使用urllib
發送GET請求:
import urllib.request
import urllib.error
try:with urllib.request.urlopen('http://example.com') as response:data = response.read()print(data.decode('utf-8'))
except urllib.error.HTTPError as e:print(f'HTTPError: {e.code} {e.reason}')
except urllib.error.URLError as e:print(f'URLError: {e.reason}')
使用requests
發送GET請求:
import requests
response = requests.get('http://example.com')
print(response.text)
使用
requests
發送網絡請求通常更加簡潔明了
然而,由于urllib
是Python標準庫的一部分,因此在不允許安裝第三方庫的環境中,urllib
可能是唯一的選擇