此文作者是剛?cè)胧諴ython,用來平時(shí)研究自動(dòng)化測試弧可,所以對Request理解有限嘁字,如有疑問可以聯(lián)系討論。
背景
Requests 繼承了urllib2的所有特性掸掸。Requests支持HTTP連接保持和連接池论皆,支持使用cookie保持會話,支持文件上傳猾漫,支持自動(dòng)確定響應(yīng)內(nèi)容的編碼点晴,支持國際化的 URL 和 POST 數(shù)據(jù)自動(dòng)編碼。
安裝
利用pip安裝:
$ pip install requests
使用
GET請求
1.基本的GET的請求
response = requests.get("http://www.baidu.com/")
#也可以這樣寫
response = requests.request("get","http://www.baidu.com/")
2.添加headers 和 params
如果想添加 headers悯周,可以傳入headers參數(shù)來增加請求頭中的headers信息粒督。如果要將參數(shù)放在url中傳遞,可以利用 params 參數(shù)禽翼。
key = {'key': 'CC'}
headers = {
"User-Agent": "Mozilla/5.0"}
response = requests.get("http://www.baidu.com/s?", params=key, headers=headers)
print(response.text)# 查看響應(yīng)內(nèi)容屠橄,response.text 返回的是Unicode格式的數(shù)據(jù)
print(response.content)# 查看響應(yīng)內(nèi)容族跛,response.content返回的字節(jié)流數(shù)據(jù)
print(response.status_code)# 查看響應(yīng)碼
如果你想取文本,可以通過response.text锐墙;如果想取圖片/文件礁哄,則可以使用response.content。
POST方法
1.基本的POST的請求
response = requests.post("http://www.baidu.com/",data = data)
2.body帶參數(shù)
formdata = {
"type": "AUTO",
"doctype": "json",
"key": "www",
"ue": "UTF-8",
}
url = "http://auto-installment/v1/loan-credit-check"
response = requests.post(url,data = data,headers=headers)
print(response.text)#顯示返回結(jié)果
print(response.json())# 如果是json文件可以直接顯示
注意:
打印的結(jié)果出現(xiàn)中文亂碼溪北,使用json.dupms(response, ensure_ascii=False))解決
Session
一般利用Session在跨請求的時(shí)候保持某些參數(shù)桐绒,比如實(shí)現(xiàn)登錄后才能訪問其他頁面
# 1. 創(chuàng)建session對象,可以保存Cookie值
session = requests.session()
# 2. 需要登錄的用戶名和密碼
data = {"username": "mxxxx", "password": "1233444"}
# 3. 發(fā)送附帶用戶名和密碼的請求之拨,并獲取登錄后的Cookie值茉继,保存在ssion里
session.post("http://www.reibang.com/sign_in", data=data)
# 4. ssion包含用戶登錄后的Cookie值,可以直接訪問那些登錄后才可以訪問的頁面
response = session.get("http://www.reibang.com/writer#/")
踩坑記要
1.在使用requests去請求一個(gè)接口時(shí)蚀乔,出現(xiàn)報(bào)錯(cuò)的情況烁竭,但是這個(gè)接口本身卻沒有問題。這是因?yàn)榻涌诘恼埱髤?shù)有兩種情況:簡單類型(一般少于3個(gè))和復(fù)雜對象類型吉挣。
解決方法:在headers中定義一下這兩種參數(shù)的類型
簡單類型:headers={"Content-Type": "application/x-www-form-urlencoded"}
復(fù)雜對象類型:headers={"Content-Type":application/json}
2.某些HTTPS請求存在 SSL證書驗(yàn)證
解決方法:response = requests.get("https://www.baidu.com/", verify=False)
擴(kuò)展
1.requests請求失敗后派撕,增加重試機(jī)制(若失敗,將會重試3次)
request_retry = requests.adapatrs.HTTPAdapaters(max_retries=3)
session.mount('https://',request_retry)
2.使用grequests實(shí)現(xiàn)異步請求
urls = [
'http://www.url1.com',
'http://www.url2.com',
'http://www.url3.com',
'http://www.url4.com',
'http://www.url5.com',
]
resp = (grequests.get(u) for u in urls)
grequests.map(resp)
3.自定義cookies
我們使用Session實(shí)例來保持請求之間的cookies睬魂,但是有些特殊情況终吼,需要使用自定義的cookies
我們使用Session實(shí)例來保持請求之間的cookies,但是有些特殊情況汉买,需要使用自定義的cookies
# 自定義cookies
cookie = {'guid':'5BF0FAB4-A7CF-463E-8C17-C1576fc7a9a8','uuid':'3ff5f4091f35a467'}
session.post('http://', cookies=cookie)
4.統(tǒng)計(jì)一個(gè)API請求花費(fèi)的時(shí)間
session.get(url).elapsed.total_seconds()
5.設(shè)置請求超時(shí)
session.get(url, timeout=15)
6.文件上傳
Requests利用files作為參數(shù)模擬提交文件數(shù)據(jù)
file = {'file':open('test.bmp','rb')} #rb表示用二進(jìn)制格式打開指定目錄下的文件,且用于只讀
r =requests.post('http://',files=file)
print(r.text)