首頁技術文章正文

requests庫與urllib庫相比有什么優(yōu)勢?

更新時間:2021-06-23 來源:黑馬程序員 瀏覽量:

IT培訓班

requests是基于Python開發(fā)的HTTP庫,與urllib標準庫相比,它不僅使用方便,而且能節(jié)約大量的工作。實際上,requests是在urllib的基礎上進行了高度的封裝,它不僅繼承了urllib的所有特性,而且還支持一些其他的特性,例如,使用Cookie保持會話、自動確定響應內(nèi)容的編碼等,可以輕而易舉地完成瀏覽器的任何操作。

requests庫中提供了如下常用的類:

(1) requests.Request:表示請求對象,用于將一個請求 發(fā)送到服務器。

(2) requests.Response:表示響應對象,其中包含服務器對HTTP請求的響應。

(3) requests.Session:表示請求會話,提供Cookie持久性、連接池和配置。

其中,Request 類的對象表示一個請求, 它的生命周期針對一個客戶端請求,一旦請求發(fā)送完畢,該請求包含的內(nèi)容就會被釋放掉。而Session類的對象可以跨越多個頁面,它的生命周期同樣針對的是一個客戶端。 當關閉這個客戶端的瀏覽器時,只要是在預先設置的會話周期內(nèi)(一般是20~30 min),這個會話包含的內(nèi)容會一直存在,不會被馬上釋放掉。例如,用戶登永某個網(wǎng)站時,可以在多個IE窗口發(fā)出多個請求。


requests庫與urllib庫代碼對比

與urllib庫相比,requests庫更加深得人心,它不僅能夠重復地讀取返回的數(shù)據(jù),而且過能自動確定響應內(nèi)容的編碼。為了能讓大家直觀地看到這些變化,下面分別使用urllib庫和requests庫爬取百度網(wǎng)站中“傳智教育”關鍵字的搜索結果網(wǎng)頁。

(1)使用urllib庫以GET請求的方式爬取網(wǎng)頁。具體代碼如下:

# 導入請求和解析模塊
import urllib.request
import urllib.parse

# 請求的URL路徑和查詢參數(shù)
url = "http://www.baidu.com/s"
word = {"wd": "傳智教育"}
# 轉換成url編碼格式(字符串)
word = urllib.parse.urlencode(word)
# 拼接完整的URL路徑
new_url = url + "?" + word
print(new_url)

# 請求報頭
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
# 根據(jù)URL和headers構建請求
request = urllib.request.Request(new_url, headers=headers)
# 發(fā)送請求,并接收服務器返回的文件對象
response = urllib.request.urlopen(request)
# 使用read()方法讀取獲取到的網(wǎng)頁內(nèi)容,使用UTF-8格式進行解碼
html = response.read().decode("UTF-8")
print(html)


(2)使用requests庫以GET請求的方式爬取網(wǎng)頁。具體代碼如下:

# 導入requests庫
import requests
# 請求的URL路徑和查詢參數(shù)
url = "http://www.baidu.com/s"
param = {"wd": "傳智教育"}

# 請求報頭
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15"}
# 發(fā)送GET請求,返回一個響應對象
response = requests.get(url, params=param, headers=headers)
# 查看響應的內(nèi)容
print(response.text)


比較上述兩段代碼不難發(fā)現(xiàn),使用requests庫減少了發(fā)送請求的代碼量。下面再從細節(jié)上體會一下庫的便捷之處,具體如下:

(1)無須再轉換為URL路徑編碼格式拼接完整的URL路徑。

(2)無須再頻繁地為中文轉換編碼格式。

(3)從發(fā)送請求的函數(shù)名稱,可以很直觀地判斷發(fā)送到服務器的方式。

(4)urlopen()方法返回的是一個文件對象, 需要調(diào)用read()方法次性讀取;而get()函數(shù)返回的是一個響應對象,可以訪問該對象的text屬性查看響應的內(nèi)容。

這里雖然只初步介紹了requests庫的用法,但是也可以從中看出,整個程序的邏輯非常易于理解,更符合面向對象開發(fā)的思想,并且減少了代碼量,提高了開發(fā)效率,給開發(fā)人員帶來了便利。


猜你喜歡:

三種分布式爬蟲策略的優(yōu)缺點

HTTP請求格式:請求行、請求頭詳細介紹

什么是網(wǎng)絡爬蟲?網(wǎng)絡爬蟲有什么用途?

多線程爬蟲是什么?多線程爬蟲流程分析

黑馬程序員python+大數(shù)據(jù)培訓課程

分享到:
在線咨詢 我要報名
和我們在線交談!