1. 程式人生 > >python之_requests庫學習_3(請求響應資訊獲取)

python之_requests庫學習_3(請求響應資訊獲取)

一、響應內容資訊獲取
1、響應狀態碼

import requests
r = requests.get('https://api.github.com/some/endpoint')
print(r.status_code) #響應狀態碼
print(r.status_code==requests.codes.ok) #內建狀態碼查詢物件
r.raise_for_status() #通過 Response.raise_for_status() 來丟擲異常

2、響應頭資訊

import requests
r = requests.get('http://httpbin.org/get')
print
(r.headers) #獲得響應頭資訊 print(r.headers['Content-Type']) print(r.headers.get('Content-Length')) >>`{'X-Processed-Time': '0.000617980957031', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Content-Length': '268', 'X-Powered-By': 'Flask', 'Date': 'Thu, 23 Nov 2017 04:13:40 GMT', 'Server': 'meinheld/0.6.1', 'Access-Control-Allow-Origin'
: '*', 'Access-Control-Allow-Credentials': 'true', 'Content-Type': 'application/json'} >>application/json >>268
`

還有一個特殊點,那就是伺服器可以多次接受同一 header,每次都使用不同的值。但 Requests 會將它們合併,這樣它們就可以用一個對映來表示出來
3、如果某些請求包含cookie,可以使用以下命令獲得cookie
獲取響應資訊中的cookie

import requests
r = requests.get('https://api.douban.com/v2/book/search?小王子'
) print(r.cookies) print(r.cookies['bid'])

在傳送請求時加入cookie引數

import requests
url= 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url,cookies=cookies)
print(r.text)

這裡寫圖片描述
4、請求資訊獲取r.request.headers
二、重定向與請求歷史

import requests
r = requests.get('http://github.com')
print(r.history)
>>[<Response [301]>]

通過 allow_redirects 引數禁用重定向處理

import requests
r = requests.get('http://github.com',allow_redirects=False)
print(r.status_code)
print(r.history)
>>301
>>[]

使用head重啟重定向

import requests
r = requests.head('http://github.com',allow_redirects=True)
print(r.url)
print(r.status_code)
print(r.history)

三、準備請求(Prepared Request)
當從 API 或者會話呼叫中收到一個 Response 物件時,request 屬性其實是使用了 PreparedRequest。有時在傳送請求之前,你需要對 body 或者 header (或者別的什麼東西)做一些額外處理

from requests import Request,Session
s = Session()
url='https://api.douban.com/v2/book/search'
data={'q':'小王子'}
header={'User-Agent':   'Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0'}
req = Request('GET',url,data=data,headers=header)
prepped = req.prepare()
resp = s.send(prepped,stream=stream,verity=verity,proxies=proxies,cert=cert,timeout=5)#可新增上述相關資訊
print(resp.status_code)

上述程式碼會失去 Requests Session 物件的一些優勢, 尤其 Session 級別的狀態,例如 cookie 就不會被應用到你的請求上去。要獲取一個帶有狀態的 PreparedRequest, 請用 Session.prepare_request() 取代 Request.prepare() 的呼叫

prepped = s.prepare_request(req)