我們通過 requests 構(gòu)造請求發(fā)送的目的就是為了通過接口訪問其返回數(shù)據(jù)邑商,也就是響應(yīng)結(jié)果。
requests 庫中提供了很多響應(yīng)結(jié)果 Response 相關(guān)的方法患膛,前面已經(jīng)提到過一些摊阀,這里詳細(xì)羅列一下。
通過發(fā)送請求的相關(guān)函數(shù)(如requests.get()
)會獲得 Response 對象踪蹬。通過 Response 對象可以獲取到以下的內(nèi)容:
- 請求相關(guān)內(nèi)容(
request
):請求頭胞此、請求報文(消息體) - 響應(yīng)相關(guān)內(nèi)容(
response
):響應(yīng)頭、響應(yīng)狀態(tài)碼跃捣、響應(yīng)報文漱牵、cookies
拿之前的 post 請求為例:
import requests
url = 'http://127.0.0.1/showdoc/server/index.php?s=/api/user/login'
data = {
'username': 'showdoc',
'password': '123456'
}
r = requests.post(url, data=data) # => r 就是 Response 對象
通過請求得到的 Response 對象可以獲取請求、響應(yīng)和歷史:
請求部分
請求部分疚漆,是當(dāng)前已發(fā)送的請求部分的內(nèi)容酣胀。類似 Fiddler 抓包數(shù)據(jù)的上半部分。包括請求頭娶聘、請求報文等信息闻镶。
print(r.request.headers) # => 請求頭部信息
## {'User-Agent': ..., 'Content-Type': 'application/x-www-form-urlencoded', ...}
print(r.request.method) # => 請求方法
## POST
print(r.request.url) # => 請求地址
## http://127.0.0.1/showdoc/server/index.php?s=/api/user/login
print(r.request.body) # => 請求報文
## username=showdoc&password=123456
響應(yīng)部分
響應(yīng)部分就是請求發(fā)送后,服務(wù)端返回的內(nèi)容丸升。這部分不管是接口測試铆农、網(wǎng)路爬蟲、應(yīng)用開發(fā)狡耻,都是主要關(guān)注的部分墩剖。
- 接口測試分析服務(wù)端的響應(yīng)數(shù)據(jù)是否符合預(yù)期
- 網(wǎng)絡(luò)爬蟲獲取到待爬取的頁面 HTML,然后可以提取需要的內(nèi)容
- 應(yīng)用開發(fā)需要從結(jié)果從讀取響應(yīng)的數(shù)據(jù)處理夷狰、展示
響應(yīng)報文部分岭皂,可以通過以下三種方法獲取:
- r.json():如果報文結(jié)構(gòu)為 json 格式孵淘,則解析為字典格式蒲障,也就是說此方法獲取的結(jié)果是字典。注意,如果報文主體不是 json 格式揉阎,則會拋出異常庄撮。
- r.text:text 屬性,可以以此方式返回除二進制外的任意數(shù)據(jù)格式毙籽,比如 HTML洞斯,XML,Json 均可坑赡。網(wǎng)絡(luò)爬蟲中一般使用此方式獲取 HTML 頁面烙如。
- r.content:content 屬性用于獲取二進制的數(shù)據(jù)格式,比如視頻毅否、圖片等亚铁,常用于網(wǎng)絡(luò)爬蟲中爬取圖片、視頻等資源螟加。
# 三種查看響應(yīng)報文的方法
print(r.json())
print(r.text)
print(r.content)
另外徘溢,還可以獲取響應(yīng)頭部相關(guān)信息,比如響應(yīng)頭捆探、服務(wù)器返回的cookies等然爆。
print(r.cookies) # => 服務(wù)端返回的 cookies
## <RequestsCookieJar[<Cookie cookie_token=... for 127.0.0.1/>]>
print(r.headers)
## {'Content-Type': 'text/html', ...}
print(r.encoding) # => 當(dāng)前編碼
## ISO-8859-1
print(r.status_code) # => 響應(yīng)狀態(tài)碼
## 200
print(r.reason) # => 狀態(tài)碼描述
## OK
如果響應(yīng)報文顯示為亂碼,可通過設(shè)置
encoding
屬性解決:r = requests.post(url, data=data) r.encoding = 'utf-8' # => 一般設(shè)置為 utf-8 即可 print(r.text)