Requests是什麼
Requests是用python語言基于urllib編寫的,采用的是Apache2 Licensed開源協定的HTTP庫 如果你看過上篇文章關于urllib庫的使用,你會發現,其實urllib還是非常不友善的,而Requests它會比urllib更加友善,可以節約我們大量的工作。(用了requests之後,你基本都不願意用urllib了)一句話,requests是python實作的最簡單易用的HTTP庫,建議爬蟲使用requests庫。 預設安裝好python之後,是沒有安裝requests子產品的,需要單獨通過pip安裝。
Requests安裝
安裝方式很簡單,直接使用指令安裝即可,如下:
pip install requests
也可直接在PyCharm工具中安裝,相信大家都已輕車熟路,就忽略了。
Requests詳細使用
1.各種請求方式
requests裡提供了各種請求方式,比如:get,post,delete,put,具體如下所示:
import requests
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.get("http://httpbin.org/get")
2.公共方法
在使用requests時,無論你使用的請求方法是get也好,post也罷,他們都會給你傳回一個響應的對象,而針對這個對象有一些特定的方法,能夠讓你進一步解析響應進而得到你想要的資料,如下:
response.json() # 以json的形式傳回響應内容,對象格式為dict
response.content # 以二進制的形式傳回響應内容,對象格式為bytes
response.text # 以字元串的形式傳回響應内容,對象格式為str
response.url # 傳回請求的url
response.status_code # 傳回本次請求的狀态碼
response.reason # 傳回狀态碼對應的原因
response.headers # 傳回響應頭
response.cookies # 傳回cookice資訊
response.raw # 傳回原始響應體
response.encoding # 傳回編碼格式
我們了解了基本的請求方式以及響應對象,接下來我們就來以執行個體再來實踐一番,加深印象以及更好的了解。
3.不帶參數的get請求
import requests
# 建構一個get請求的對象
response = requests.get('http://www.baidu.com')
# 以字元串的形式傳回響應的内容
print response.text
4.帶參數的get請求
import requests
# 基本get請求
r = requests.get(url='http://www.baidu.com') # 最基本的GET請求
print(r.status_code) # 擷取傳回狀态
r = requests.get(url='http://www.baidu.com/s', params={'wd': '溫一壺清酒 部落格園'}) # 帶參數的GET請求
print(r.url)
print(r.text) # 列印解碼後的傳回資料
我們也可以把參數放到一個變量中傳遞,如下:
import requests
params = {
'wd': '溫一壺清酒 部落格園'
}
# 基本get請求
r = requests.get(url='http://www.baidu.com') # 最基本的GET請求
print(r.status_code) # 擷取傳回狀态
r = requests.get(url='http://www.baidu.com/s', params=params) # 帶參數的GET請求
print(r.url)
print(r.text) # 列印解碼後的傳回資料
5.普通登入post請求
以普通登入方式為例,如下所示:
import requests
# 普通登入
headers = {'Authorization': ''}
r = requests.post(url='XXXX', data={
'username': '', 'password': ''},headers=headers)
print(r.url)
print(r.status_code) # 擷取傳回狀态
print(r.text) # 列印解碼後的傳回資料
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuAjNyQTNzkDN40iM0YjN1IDN5ETNxATM5EDMy0yNyIjM0ITMvwFMxkTMwIzLcdjMyIDNyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
6.basic auth登入post請求
方式一:
import requests
from requests.auth import HTTPBasicAuth
# basic auth方式登入
# 方法一
a = HTTPBasicAuth('', '')
r = requests.post(url="XXXXXXX", data={'grant_type': '', 'scope': ''},auth=a)
print(r.status_code) # 擷取傳回狀态
print(r.text) # 列印解碼後的傳回資料
方式二:
import requests
# basic auth方式登入
# 方法二 (隻加載requests子產品就行)
r = requests.post(url='XXXXXXXX', data={'grant_type': '', 'scope': ''},auth=('', ''))
print(r.status_code) # 擷取傳回狀态
print(r.text) # 列印解碼後的傳回資料
7.設定請求頭
如普通登入post請求方式所示,就添加了headers參數,不同的應用場景,headers裡面的參數也就各不同。示例參見第五點即可。
8.證書驗證
有些網址通路時,需要校驗證書,比如12306官網,我們先來簡單通路下,如下:
import requests
# 證書驗證
r = requests.get("https://www.12306.cn")
print(r.status_code)
print(r.text)
運作代碼,報錯如下:
在網上尋找一番,可以得到答案,如下所示:
import requests
import urllib3
# 證書驗證
urllib3.disable_warnings()
r = requests.get("https://www.12306.cn", verify=False)
print(r.status_code)
print(r.text)
再次通路,就可以正常進入官網了。
9.json響應資料格式調整
比如下登入操作時,傳回的json資料,在控制台中是一行展示,如果資料過多,則不便于檢視,如下所示:
使用如下代碼實作:
import requests
import json
def better_output(json_str):
return json.dumps(json.loads(json_str), indent=4)
url = "XXXXXX"
headers = {'Authorization': ''}
request_param = {
'username': '', 'password': ''
}
response = requests.post(url, data=request_param, headers=headers)
print(better_output(response.text))
再次運作代碼,檢視json資料,如下所示,這樣就很友善檢視了。
10.動态傳參
我們實作登入之後,繼續做下一步操作,那就需要傳遞token了,不然會報401錯誤,沒有權限。接下來就來看下如何實作:
import requests
import json
host = ''
# json資料轉換格式,ensure_ascii顯示為中文
def better_output(json_str):
return json.dumps(json.loads(json_str), indent=4, ensure_ascii=False)
def login():
# 普通登入
headers = {'Authorization': ''}
data = {
'username': '',
'password': ''
}
url = host + '/token'
r = requests.post(url=url, data=data, headers=headers, verify=False)
# 設定全局變量
global token
token = (r.json()["access_token"])
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("+++登入接口響應的狀态碼為:" + str(r.status_code)) # 擷取傳回狀态
print("+++登入接口響應的資料為:" + better_output(r.text)) # 列印解碼後的傳回資料
print("+++擷取到的token值為:" + token)
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
login()
将token設定成全局變量,便可在各接口間傳遞,token已經擷取到,将token傳到headers中即可,如下:
headers = {
'Content-Type': 'application/json;charset=utf-8',
# token傳參
'Authorization': 'Bearer ' + token
}
11.json入參嵌套
import requests,json
url = "http://xxx"
headers = {"Content-Type":"application/json","Authorization":"Bearer token值"}
data1 = {"key1":"value1","key2":"value2"}
data = {"params":data1}
r = request.post(url = url,data = json.dumps(data),headers = headers)
import requests,json
url = "http://xxx"
headers = {"Content-Type":"application/json","Authorization":"Bearer token值"}
data1 = {"key1":"value1","key2":"value2"}
data = {"params":data1}
r = request.post(url = url,json = data,headers = headers)
Requests綜合實踐
如下講述了這麼多,就統一來個綜合實踐,裡面包含了動态傳參,添加請求頭,json入參嵌套等,如下所示:
import requests
import json
host = ''
# json資料轉換格式,ensure_ascii顯示為中文
def better_output(json_str):
return json.dumps(json.loads(json_str), indent=4, ensure_ascii=False)
def login():
# 普通登入
headers = {'Authorization': ''}
data = {
'username': '',
'password': '',
}
url = host + '/token'
r = requests.post(url=url, data=data, headers=headers, verify=False)
# 設定全局變量
global token
token = (r.json()["access_token"])
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("+++登入接口響應的狀态碼為:" + str(r.status_code)) # 擷取傳回狀态
print("+++登入接口響應的資料為:" + better_output(r.text)) # 列印解碼後的傳回資料
print("+++擷取到的token值為:" + token)
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
def search_gender_data():
# 搜尋接口
headers = {
'Content-Type': 'application/json;charset=utf-8',
# token傳參
'Authorization': 'Bearer ' + token
}
url = host + '/api'
r1 = requests.get(url=url, headers=headers)
global gender
gender = r1.json()['values'][0]['code']
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("+++搜尋接口響應的狀态碼為:" + str(r1.status_code)) # 擷取傳回狀态
print("+++搜尋接口響應的資料為:" + better_output(r1.text))
print("+++擷取的性别code為:" + gender)
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
def create_user():
headers = {
'Content-Type': 'application/json;charset=utf-8',
# token傳參
'Authorization': 'Bearer ' + token
}
data = {
"duty": "",
"dutyCode": "",
"rank": "",
"rankCode": "",
"deleted": 'false',
"userId": "",
"employeeId": "",
"position": "測試負責人",
"companyMainPosition": 'true',
}
data1 = {
"departmentPath": "",
"directManager": "",
"directManagerId": '',
"directManagerName": "",
"employeeType": '',
"email": "[email protected]",
"mobile": "15110151015",
"mobileCode": "86",
"countryCode": "CN",
"employeeTypeCode": "",
"userOID": '',
"employeeID": "10150001",
"fullName": "10150001接口新增",
"status": 1001,
"manager": 'false',
"leavingDate": "3018-01-31T16:00:00.000Z",
"gender": "",
"genderCode": gender,
"birthday": "",
"entryTime": "",
"customFormValues": [],
'userJobsDTOs': [data]
}
url = host + '/api'
create_u = requests.post(url=url, json=data1, headers=headers)
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("+++建立人員接口url為:" + url)
print("+++建立人員接口響應的狀态碼為:" + str(create_u.status_code)) # 擷取傳回狀态
print("+++建立人員接口響應的資料為:" + better_output(create_u.text))
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
if __name__ == '__main__':
# 調用函數
login()
search_gender_data()
create_user()
Requests實踐詳解希望對有需要的朋友有所幫助,都是些基本的操作,部落格書寫,也是我自己學習的一種方式。文中描述有誤的地方,歡迎批評指正。