博客
关于我
Requests实践详解
阅读量:417 次
发布时间:2019-03-06

本文共 8098 字,大约阅读时间需要 26 分钟。

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的形式返回响应内容,对象格式为dictresponse.content           # 以二进制的形式返回响应内容,对象格式为bytesresponse.text            # 以字符串的形式返回响应内容,对象格式为strresponse.url             # 返回请求的urlresponse.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 requestsparams = {    '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 requestsfrom 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 requestsimport urllib3# 证书验证urllib3.disable_warnings()r = requests.get("https://www.12306.cn", verify=False)print(r.status_code)print(r.text)

再次访问,就可以正常进入官网了。

9.json响应数据格式调整

比如下登录操作时,返回的json数据,在控制台中是一行展示,如果数据过多,则不便于查看,如下所示:

使用如下代码实现:

import requestsimport jsondef 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 requestsimport jsonhost = ''# 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 requestsimport jsonhost = ''# 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://lzluz.baihongyu.com/

你可能感兴趣的文章
OAuth2.0认证详解
查看>>
如何禁用控制台窗口的关闭按钮?
查看>>
004.Kickstart部署之FTP架构
查看>>
001. Ansible简介
查看>>
006.SQLServer AlwaysOn可用性组高可用部署
查看>>
001.FTP简介及相关文件
查看>>
004.LVM缩减
查看>>
Maven构建命令相关
查看>>
Windows下chm转换为html的超简单方法
查看>>
Unknown character set: 'utf8mb4'
查看>>
《SpringCloud实战项目》系列目录
查看>>
【Discuz】关闭QQ互联插件提示信息:系统繁忙,请稍后再试
查看>>
Netflix是什么,与Spring Cloud有什么关系
查看>>
秒懂JVM的三大参数类型,就靠这十个小实验了
查看>>
干货 | 45张图庖丁解牛18种Queue,你知道几种?
查看>>
SpringBoot中的自动代码生成 - 基于Mybatis-Plus
查看>>
对象的可见性 - volatile篇
查看>>
端口重用
查看>>
应届生/社招面试最爱问的几道Java基础问题
查看>>
为什么面试完,总是让你回去等通知?
查看>>