更新時(shí)間:2021年06月23日15時(shí)09分 來(lái)源:傳智教育 瀏覽次數(shù):
requests是基于Python開(kāi)發(fā)的HTTP庫(kù),與urllib標(biāo)準(zhǔn)庫(kù)相比,它不僅使用方便,而且能節(jié)約大量的工作。實(shí)際上,requests是在urllib的基礎(chǔ)上進(jìn)行了高度的封裝,它不僅繼承了urllib的所有特性,而且還支持一些其他的特性,例如,使用Cookie保持會(huì)話(huà)、自動(dòng)確定響應(yīng)內(nèi)容的編碼等,可以輕而易舉地完成瀏覽器的任何操作。
(1) requests.Request:表示請(qǐng)求對(duì)象,用于將一個(gè)請(qǐng)求 發(fā)送到服務(wù)器。
(2) requests.Response:表示響應(yīng)對(duì)象,其中包含服務(wù)器對(duì)HTTP請(qǐng)求的響應(yīng)。
(3) requests.Session:表示請(qǐng)求會(huì)話(huà),提供Cookie持久性、連接池和配置。
其中,Request 類(lèi)的對(duì)象表示一個(gè)請(qǐng)求, 它的生命周期針對(duì)一個(gè)客戶(hù)端請(qǐng)求,一旦請(qǐng)求發(fā)送完畢,該請(qǐng)求包含的內(nèi)容就會(huì)被釋放掉。而Session類(lèi)的對(duì)象可以跨越多個(gè)頁(yè)面,它的生命周期同樣針對(duì)的是一個(gè)客戶(hù)端。 當(dāng)關(guān)閉這個(gè)客戶(hù)端的瀏覽器時(shí),只要是在預(yù)先設(shè)置的會(huì)話(huà)周期內(nèi)(一般是20~30 min),這個(gè)會(huì)話(huà)包含的內(nèi)容會(huì)一直存在,不會(huì)被馬上釋放掉。例如,用戶(hù)登永某個(gè)網(wǎng)站時(shí),可以在多個(gè)IE窗口發(fā)出多個(gè)請(qǐng)求。
與urllib庫(kù)相比,requests庫(kù)更加深得人心,它不僅能夠重復(fù)地讀取返回的數(shù)據(jù),而且過(guò)能自動(dòng)確定響應(yīng)內(nèi)容的編碼。為了能讓大家直觀地看到這些變化,下面分別使用urllib庫(kù)和requests庫(kù)爬取百度網(wǎng)站中“傳智教育”關(guān)鍵字的搜索結(jié)果網(wǎng)頁(yè)。
(1)使用urllib庫(kù)以GET請(qǐng)求的方式爬取網(wǎng)頁(yè)。具體代碼如下:
# 導(dǎo)入請(qǐng)求和解析模塊 import urllib.request import urllib.parse # 請(qǐng)求的URL路徑和查詢(xún)參數(shù) url = "http://www.baidu.com/s" word = {"wd": "傳智教育"} # 轉(zhuǎn)換成url編碼格式(字符串) word = urllib.parse.urlencode(word) # 拼接完整的URL路徑 new_url = url + "?" + word print(new_url) # 請(qǐng)求報(bào)頭 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構(gòu)建請(qǐng)求 request = urllib.request.Request(new_url, headers=headers) # 發(fā)送請(qǐng)求,并接收服務(wù)器返回的文件對(duì)象 response = urllib.request.urlopen(request) # 使用read()方法讀取獲取到的網(wǎng)頁(yè)內(nèi)容,使用UTF-8格式進(jìn)行解碼 html = response.read().decode("UTF-8") print(html)
(2)使用requests庫(kù)以GET請(qǐng)求的方式爬取網(wǎng)頁(yè)。具體代碼如下:
# 導(dǎo)入requests庫(kù) import requests # 請(qǐng)求的URL路徑和查詢(xún)參數(shù) url = "http://www.baidu.com/s" param = {"wd": "傳智教育"} # 請(qǐng)求報(bào)頭 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請(qǐng)求,返回一個(gè)響應(yīng)對(duì)象 response = requests.get(url, params=param, headers=headers) # 查看響應(yīng)的內(nèi)容 print(response.text)
比較上述兩段代碼不難發(fā)現(xiàn),使用requests庫(kù)減少了發(fā)送請(qǐng)求的代碼量。下面再?gòu)募?xì)節(jié)上體會(huì)一下庫(kù)的便捷之處,具體如下:
(1)無(wú)須再轉(zhuǎn)換為URL路徑編碼格式拼接完整的URL路徑。
(2)無(wú)須再頻繁地為中文轉(zhuǎn)換編碼格式。
(3)從發(fā)送請(qǐng)求的函數(shù)名稱(chēng),可以很直觀地判斷發(fā)送到服務(wù)器的方式。
(4)urlopen()方法返回的是一個(gè)文件對(duì)象, 需要調(diào)用read()方法次性讀取;而get()函數(shù)返回的是一個(gè)響應(yīng)對(duì)象,可以訪問(wèn)該對(duì)象的text屬性查看響應(yīng)的內(nèi)容。
這里雖然只初步介紹了requests庫(kù)的用法,但是也可以從中看出,整個(gè)程序的邏輯非常易于理解,更符合面向?qū)ο箝_(kāi)發(fā)的思想,并且減少了代碼量,提高了開(kāi)發(fā)效率,給開(kāi)發(fā)人員帶來(lái)了便利。
猜你喜歡:
Python網(wǎng)絡(luò)爬蟲(chóng)獲取數(shù)據(jù)有哪幾種方式?
用Python開(kāi)發(fā)的爬蟲(chóng)程序可以用來(lái)做什么?
北京校區(qū)