接口說明
#使用requests庫前都要導入requests庫
import requests
#發(fā)送GET,POST,PUT,DELETE,HEAD 以及 OPTIONS 請求
r = requests.get('https://postman-echo.com/get')
r = requests.post('https://postman-echo.com/post')
r = requests.put('https://postman-echo.com/put')
r = requests.delete('https://postman-echo.com/delete')
r = requests.head('https://postman-echo.com/get')
響應(yīng)對象Response
響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)體
import requests
# 訪問百度首頁
# 返回值為Response對象
resp = requests.get('https://www.baidu.com')
# 查看響應(yīng)狀態(tài)碼
print(resp.status_code)
# 200
# 查看響應(yīng)頭
print(resp.headers)
# 查看響應(yīng)體,未進行解碼
# content 是字節(jié)類型數(shù)據(jù)
print(resp.content)
# 查看響應(yīng)體,解碼之后的
print(resp.text)
字符編碼
請求發(fā)出后,Requests 會基于 HTTP 頭部對響應(yīng)的編碼作出推測。
當你訪問 resp.text 之時,Requests 會使用其推測的文本編碼, 如果 request 推測的編碼和實際的響應(yīng)的編碼不同則可能出現(xiàn)亂碼。
我們可以通過 resp.encoding 查看當前猜測的編碼, 也可以通過賦值來改變這個編碼.
import requests
resp = requests.get('https://www.baidu.com')
# 查看當前的 encoding
print(resp.encoding)
# 'ISO-8859-1'
# 更改 encoding
resp.encoding = 'utf-8'
# 查看更改后的 encoding
print(resp.encoding)
# 'utf-8'
# 查看解碼的文本內(nèi)容
print(resp.text)
# 非亂碼的內(nèi)容
Response.json()
Response.json()方法可以將接口json格式的返回內(nèi)容自動轉(zhuǎn)換為python的字典
import requests
# 這里請求 postman 提供的地址,他會返回一個 json 格式的響應(yīng)體
url = 'https://postman-echo.com/ip'
resp = requests.get(url)
# 字符串格式返回響應(yīng)體內(nèi)容
print(resp.text, type(resp.text))
# 通過響應(yīng)對象的 json 方法獲取 json 數(shù)據(jù)
print(resp.json(), type(resp.json()))
返回內(nèi)容如下
{"ip":"183.47.51.10"} <class 'str'>
{'ip': '183.47.51.10'} <class 'dict'>
注意:如果 JSON 解碼失敗, r.json() 就會拋出一個異常。例如,響應(yīng)內(nèi)容是 html 格式的,嘗試訪問 r.json() 將會拋出異常。
import requests
# 這里請求百度首頁
url = 'https://www.baidu.com'
# 請求 baidu 的首頁,這里會獲得 html
resp = requests.get(url)
# 響應(yīng)體不是 json 類型,會拋出異常
print(resp.json())
錯誤信息如下:
Traceback (most recent call last):
File "/home/python/code/requests_code/requests_4_jsonerr.py", line 10, in
print(resp.json())
File "/home/python/.virtualenvs/test_v7/lib/python3.6/site-packages/requests/models.py", line 896, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
發(fā)送GET請求
傳遞URL參數(shù)
import requests
# 這個接口會把我們傳遞的 url 參數(shù),通過響應(yīng)體返回
url = 'https://postman-echo.com/get'
resp = requests.get(url)
# 查看響應(yīng)體 json
print(resp.json())
print('='*80)
# GET請求時傳遞參數(shù)
payload = {'key1': 'value1', 'key2': 'value2', 'key3': ['value3', 'valua4']}
# 通過 params 參數(shù)傳遞 url 參數(shù)
resp = requests.get(url, params=payload)
# 查看發(fā)起請求的的完整 url
print(resp.url)
# 查看響應(yīng)體
print(resp.json())
print('='*80)
# 手動拼接參數(shù)
url = 'https://postman-echo.com/get?key1=value1&key2=value2&key3=value3&key3=value4'
resp = requests.get(url)
# 查看響應(yīng)體 json
print(resp.json())
定制請求頭
import requests
# 這個接口會把我們攜帶的請求頭通過響應(yīng)體返回
url = 'https://postman-echo.com/headers'
resp = requests.get(url)
# 查看響應(yīng)體 json
print(resp.json())
print('='*80)
# 定義請求頭字典
headers = {'name': 'mike'}
# 通過 headers 參數(shù)傳遞自定義請求頭
resp = requests.get(url, headers=headers)
# 查看響應(yīng)體 json
print(resp.json())
定制cookies
import requests
# 這個接口會把我們攜帶的cookies通過響應(yīng)體返回
url = 'https://postman-echo.com/cookies'
resp = requests.get(url)
# 查看響應(yīng)體 json
print(resp.json())
print('='*80)
# 構(gòu)建 cookie
cookies = {
'foo1':'foo1',
'foo2':'foo2'
}
# 通過 cookies 參數(shù)發(fā)送 cookies
resp = requests.get(url, cookies=cookies)
# 查看響應(yīng)體 json
print(resp.json())
發(fā)送POST請求
在通過requests.post()進行POST請求時,傳入報文的參數(shù)有兩個,一個是data,一個是json
data主要是發(fā)送表單格式報文
json主要是發(fā)送json格式報文
以下發(fā)送json格式數(shù)據(jù):
import requests
import requests
# 目標url
url = 'http://127.0.0.1:8000/login/'
# 構(gòu)造請求體
info = {
"username":"1234",
"password":"123456",
"remembered":True
}
# 向目標url發(fā)送post請求
response = requests.post(url, json=info)
# 打印響應(yīng)內(nèi)容
print(response.json())
============================================
利用requests.session進行狀態(tài)保持
- 我們通過瀏覽器進行登錄操作時,服務(wù)器會返回cookie,瀏覽器會把這些 cookie 存儲下來,下次發(fā)起請求就把之前保存的 cookie 攜帶著發(fā)送給服務(wù)器,從而實現(xiàn)了狀態(tài)保持。
- 我們通過 requests進行登錄操作或者其他操作,服務(wù)器返回了 cookie,下次再通過 requests發(fā)起其他請求時,requests 并不會把前面請求的 cookie 攜帶著發(fā)送給服務(wù)器,也就是說我們通過 requests是無法自動實現(xiàn)狀態(tài)保持的。
- requests模塊中的Session類能夠自動處理發(fā)送請求獲取響應(yīng)過程中產(chǎn)生的cookie,進而達到狀態(tài)保持的目的。
- session實例在請求了一個網(wǎng)站后,對方服務(wù)器設(shè)置在本地的cookie會保存在session對象中,下一次再使用session請求對方服務(wù)器的時候,會帶上前一次的cookie
需求:獲取用戶信息。獲取用戶信息必須先調(diào)用進行用戶登錄接口,在調(diào)用獲取用戶信息接口。
requests方式:
import requests
# 目標url
url = 'http://127.0.0.1:8000/login/'
# 構(gòu)造請求體
info = {
"username":"1234",
"password":"123456",
"remembered":True
}
# 向目標url發(fā)送post請求
resp = requests.post(url, json=info)
# 打印響應(yīng)內(nèi)容
print(resp.json())
# 獲取用戶信息
resp = requests.get('http://127.0.0.1:8000/info/')
print(resp.json())
運行結(jié)果如下:
{'code': 0, 'errmsg': 'ok'}
{'code': 400, 'errmsg': '未登陸!'}
session方式:
import requests
# 目標url
url = 'http://127.0.0.1:8000/login/'
# 構(gòu)造請求體
info = {
"username":"1234",
"password":"123456",
"remembered":True
}
# 創(chuàng)建session對象
session = requests.Session()
# 向目標url發(fā)送post請求
resp = session.post(url, json=info)
# 打印響應(yīng)內(nèi)容
print(resp.json())
# 獲取用戶信息
resp = session.get('http://127.0.0.1:8000/info/')
print(resp.json())
運行結(jié)果如下:
{'code': 0, 'errmsg': 'ok'}
{'code': 0, 'errmsg': 'ok', 'info_data': {'username': '1234', 'mobile': '13344445555', 'email': '', 'email_active': False}}