Requests實踐詳解
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) # 列印解碼後的返回資料
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實踐詳解希望對有需要的朋友有所幫助,都是些基本的操作,部落格書寫,也是我自己學習的一種方式。文中描述有誤的地方,歡迎批評指正。
本文僅代表作者觀點,系作者@溫一壺清酒發表。
歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
文章出處:http://www.cnblogs.com/hong-fithing/