requests的使用

接口說明

#使用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}}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容