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/

原文地址:https://www.cnblogs.com/hong-fithing/p/11679676.html

时间: 2024-10-11 10:25:51

Requests实践详解的相关文章

Cocos2d-x手机游戏开发与项目实践详解_随书代码

Cocos2d-x手机游戏开发与项目实战详解_随书代码 作者:沈大海  由于原作者共享的资源为UTF-8字符编码,下载后解压在win下显示乱码或还出现文件不全问题,现完整整理,解决所有乱码问题,供大家下载. 下载地址:http://download.csdn.net/detail/oyangyufu/7665049 Cocos2d-x手机游戏开发与项目实践详解_随书代码

21个项目玩转深度学习:基于TensorFlow的实践详解06—人脸检测和识别——数据集

书籍:<21个项目玩转深度学习:基于TensorFlow的实践详解> 人脸检测 FDDB FDDB是UMass的数据集,被用来做人脸检测(Face Detection).这个数据集比较大,比较有挑战性.而且作者提供了程序用来评估检测结果,所以在这个数据上面比较算法也相对公平. 2845 张图片,其中包含了 5171 张人脸: 包含了各种遮挡,高难度的姿态,低分辨率以及对焦模糊的人脸: 用椭圆来标定人脸区域: 同时包括灰度图和彩色图. 人脸识别 LFW 户外标记人脸数据集LFW (Labeled

分享《21个项目玩转深度学习:基于TensorFlow的实践详解》PDF+源代码

下载:https://pan.baidu.com/s/19GwZ9X2E20L3BykhoxhjTg 更多资料:http://blog.51cto.com/3215120 <21个项目玩转深度学习:基于TensorFlow的实践详解>PDF+源代码PDF,378页,带书签目录,文字可以复制.配套源代码.深度学习经典书籍. 如图: 原文地址:http://blog.51cto.com/3215120/2316094

《21个项目玩转深度学习:基于TensorFlow的实践详解》

下载:https://pan.baidu.com/s/1NYYpsxbWBvMn9U7jvj6XSw更多资料:http://blog.51cto.com/3215120<21个项目玩转深度学习:基于TensorFlow的实践详解>PDF+源代码PDF,378页,带书签目录,文字可以复制.配套源代码.深度学习经典书籍.如图: <div id="jspay" sid="DkfSZwf0121" style="display:none"

实践:《21个项目玩转深度学习基于TensorFlow的实践详解》PDF+源代码

学习<21个项目玩转深度学习>可以在自己动手实践的过程中找到学习的乐趣,了解算法和编程框架的细节,让学习深度学习算法和TensorFlow 的过程变得轻松和高效. 不是给想学深度学习的初学者看的,没有详细的讲解,只有项目操作的指示.但对于没有任何深度学习基础,又要尽快做出视觉分类demo的人来说是一本好书,能帮助快速上手. 学习实践: <21个项目玩转深度学习:基于TensorFlow的实践详解>PDF,378页,带书签目录,文字可以复制.配套源代码. 网盘下载:http://10

《21个项目玩转深度学习:基于TensorFlow的实践详解》高清带标签PDF版本学习下载

1 写在前面 <21个项目玩转深度学习——基于TensorFlow的实践详解>以实践为导向,深入介绍了深度学习技术和TensorFlow框架编程内容. 通过本书,读者可以训练自己的图像识别模型.进行目标检测和人脸识别.完成一个风格迁移应用,还可以使用神经网络生成图像和文本,进行时间序列预测.搭建机器翻译引擎,训练机器玩游戏.全书共包含21个项目,分为深度卷积网络.RNN网络.深度强化学习三部分.读者可以在自己动手实践的过程中找到学习的乐趣,了解算法和编程框架的细节,让学习深度学习算法和Tens

跨平台:GN实践详解(ninja, 编译, windows/mac/android实战)

跨平台:GN实践详解(ninja, 编译, windows/mac/android实战)展开目录一.概览二.跨平台代码编辑器三.GN入门四.示范工程五.关键细节六.结语 [编译器选项] 其中前两部分是前缀部分,原本没有跨平台构建经验和知识的同学可以借助来帮助理解,后四部分则是讲述GN工程的基本结构.如何搭建一个GN构建的工程.以及关键的一些GN知识 一.概览如何开始这个话题是我比较在意的,因为对于部分人而言,真正从思维和理解上切入这篇文章真正要阐述的点是有困难的.这在于跨平台编译和开发这块,如果

python WEB接口自动化测试之requests库详解

1.Get请求 前提: requests库是python的第三方库,需要提前安装哦,可以直接用pip命令:`python –m pip install requests` 按照惯例,先将requests库的属性打印出来,看看哪些属性. >>> import requests >>> dir(requests) #查看requests库的属性 ['ConnectionError', 'HTTPError', 'NullHandler', 'PreparedRequest'

python requests模块详解

requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码. 我也看了下requests的文档,确实很简单,适合我这种懒人.下面就是一些简单指南. 插播个好消息!刚看到requests有了中文翻译版,建议英文不好的看看,内容也比我的博客好多了,具体链接是:http://cn