Requests實踐詳解

Requests是什麼

Requests是用python語言基於urllib編寫的,採用的是Apache2 Licensed開源協議的HTTP庫 若是你看過上篇文章關於urllib庫的使用,你會發現,其實urllib仍是很是不方便的,而Requests它會比urllib更加方便,能夠節約咱們大量的工做。(用了requests以後,你基本都不肯意用urllib了)一句話,requests是python實現的最簡單易用的HTTP庫,建議爬蟲使用requests庫。 默認安裝好python以後,是沒有安裝requests模塊的,須要單獨經過pip安裝。python

Requests安裝

安裝方式很簡單,直接使用命令安裝便可,以下:json

pip install requests

也可直接在PyCharm工具中安裝,相信你們都已輕車熟路,就忽略了。api

Requests詳細使用

1.各類請求方式

requests裏提供了各類請求方式,好比:get,post,delete,put,具體以下所示:cookie

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也罷,他們都會給你返回一個響應的對象,而針對這個對象有一些特定的方法,可以讓你進一步解析響應從而獲得你想要的數據,以下:app

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請求

以普通登陸方式爲例,以下所示: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": "10150001@qq.com",
        "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/
相關文章
相關標籤/搜索