Python requests库用法实例详解


Posted in Python onAugust 14, 2018

本文实例讲述了Python requests库用法。分享给大家供大家参考,具体如下:

requests是Python中一个第三方库,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。接下来将记录一下requests的使用:

安装

要使用requests库必须先要安装:

pip install requests

创建请求

通过requests库发出一个请求非常简单,首先我们先导入requests库:

import requests

现在我们尝试创建一个请求,用来获取百度的网页信息:

result = requests.get('http://www.baidu.com/')

现在我们获取到了一个Response对象result,我们可以从这个对象中获得所有我们需要的所有信息。刚刚的栗子是使用的GET请求,接下来将使用requests库进行POST请求:

result = requests.post('http://www.baidu.com/',data={key:value})

很简单对吧?那么其他HTTP请求呢:PUT、DELETE、HEAD和OPTIONS呢?

result = requests.put('http://www.baidu.com/',data={key,value})
result = requests.head('http://www.baidu.com/')
result = requests.delete('http://www.baidu.com/')
result = requests.options('http://www.baidu.com/')

在URL中传递参数

你经常想要在URL的查询字符串中发送某种数据。如果你手动构建网址,那么这个数据会在问号后作为网址中的键值对,例如https://www.baidu.com/s?wd=requests。请求允许你使用params关键字参数将这些参数作为字符串字典提供。举个栗子,你想传递name=zhangsan并且age=18到https://www.baidu.com/s,你可以这样写:

data = {"name":"zhangsan","age":18}
result = requests.get("https://www.baidu.com/s",params=data)

此时我们打印一下URL,发现该URL已经被正确编码:

print result.url # https://www.baidu.com/s?name=zhangsan&age=18

也可以传递一个列表进去:

data = {"name":"zhangsan","favorite":["football","basketball"]}
result = requests.get("https://www.baidu.com/s",params=data)
print result.url # https://www.baidu.com/s?name=zhangsan&favorite=football&favorite=basketball

响应内容

在上面的例子可以知道,我们每次请求之后都会返回一个对象,我们可以从此对象中获取响应内容:

result = requests.get("https://api.github.com/events")
print result.text    # [{"id":"6924608641","type":"PushEvent",...}]

二进制响应内容

print result.content  # b'[{"id":"6924656608","type":"CreateEvent",...}]'

JSON格式的响应内容,如果解码失败,result.json()将会引发异常

print result.json()     # [{"id":"6924608641","type":"PushEvent",...}]

请求将自动解码来自服务器的内容。大多数unicode字符集都是无缝解码的。我们也可以根据如下方法获取当前的编码:

print result.encoding

如果响应的内容并不是你想要的编码格式,你可以在调用result.text之前,对result.encoding进行赋值,给予新的编码格式。

要检查一个请求是否成功,使用result.raise_for_status()或者result.status_code来检查是否你期望的

套接字响应

在极少数情况下,你希望从服务器中获得是原始套接字响应,你可以通过result.raw来获取。如果你想这样做,确保你设置stream=True在你的初始请求。一旦你这样操作了,你可以这样:

result = requests.get("https://api.github.com/events",stream=True)
print result.raw        # <urllib3.response.HTTPResponse object at 0x10ce52dd8>
print result.raw.read(10)    # b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

通常情况下,我们使用如下这种模式来保存正在流式传输的内容:

with open("info.txt","wb") as f:
  for item in result.iter_content(chunk_size=128):
    f.write(item)

自定义头部

如果你想将自定义请求头添加到请求当中,只需要传递一个字典到headers参数即可。例如,在请求中指定我们的请求代理:

header = {"user-agent":'my_test/0001'}
result = requests.get("https://api.github.com/events",headers=header)

注意,请求头的值必须是一个字符串,byte类型的字符串或者unicode。虽然允许unicode,但还是避免使用unicode

复杂的post请求

通常情况下,你想要发送一些表单编码数据,就像HTML表单一样。要做到这一点,你只需要将字典传递给data参数即可:

infoDict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=infoDict)

你也可以传递一个元组数据:

tupleInfo = ("name","张三")
result = requests.post('http://127.0.0.1:5000/test/post',data=tupleInfo)

有时你需要发送一些非编码格式的数据,即你发送的是一个string而不是dict,那么数据将会直接发送:

import json
infoDict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=json.dumps(infoDict))

如果你想要发送一个字典数据,你可以通过它使用json参数,它会自动编码:

infoDict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',json=infoDict)

注意,如果你传递了data参数或者files,那么json将会被忽略

post上传文件

requests上传文件其实很简单:

with open('info.txt','rb') as f:
  result = requests.post('http://localhost:5000/post',files={"files":f})

响应状态码

我们执行完一个请求之后,我们可以使用如下方法查看状态码,检测请求是否成功:

result = requests.get('http://localhost:5000/get')
print result.status_code  # 200

当返回200,表示请求执行成功,我们还可以使用如下方法判断请求是否成功,True为成功,False不成功:

print result.staatus_code == requests.codes.ok    # True

当我们执行一个错误的请求(4XX客户端错误,5XX服务器错误)时,我们可以以下方法来抛出异常进行检车:

result = requests.get('http://localhost:5000/get')
print result.status_code      # 404
print result.raise_for_status()   # Traceback (most recent call last): ...

但是如果我们的请求是执行成功的,即状态码为200,此时raise_for_status()的值将会是None

响应头

我们可以使用Python字典来查看服务器的响应头文件:

print result.headers    # {'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '2', 'Server': 'Werkzeug/0.12.2 Python/2.7.10', 'Date': 'Sun, 03 Dec 2017 14:15:32 GMT'}

Cookies

如果响应包含了Cookie,你可以这样快速的访问它:

result = requests.get('http://localhost:5000/get')
print result.cookies['userName']

或者你需要将自己的Cookie发送给服务器,你可以使用cookies参数:

cookie = {'userName':'zhangsan'}
result = requests.get('http://localhost:5000/get',cookies=cookie)

RequestCookieJar提供了一个完整的接口,适合在多个域和路径中使用,它将返回一个Cookie,所以它也可以被传入到cookies参数中

c = requests.cookies.RequestsCookieJar()
c.set('userName','zhangsan',domain='http://localhost:5000',path='/get')
result = requests.get('http://localhost:5000/get',cookies=c)

Session对象

Session对象允许你在请求中保存某些参数,它将在所有由会话实例创建的请求中保存Cookie,并将使用urllib3连接池。如果你想同一主机发出多个请求,则会重新使用底层的TCP连接,这将使性能显著提高。Session具有主API的所有请求方法:

s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

但是请注意,方法级参数不会保存在请求,即使使用一个session。这个栗子只会发送第一个请求的Cookie,不会发送第二个:

result = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(result.text)
# '{"cookies": {"from-my": "browser"}}'
result = s.get('http://httpbin.org/cookies')
print(result.text)
# '{"cookies": {}}'

请求和响应对象

每当你发起一个GET请求,你都在做两件事。首先,构造一个Request将被发送到服务器的对象来请求或查询某个资源。其次,Response一旦从服务器中获得响应,就会生成一个对象。该Response对象包含服务器锁返回的所有信息,并且还包含Request你最初创建的对象。这是一个简单的请求,从维基百科的服务器获取一些非常重要的信息:

result = requests.get('http://en.wikipedia.org/wiki/Monty_Python')

现在我们需要获取服务器发送给我们的头文件信息:

print result.headers

如果我们需要获取发送给服务器的头文件信息,我们可以这样:

print result.request.headers

SSL证书验证

请求将验证HTTPS请求的SSL证书,就像Web浏览器一样。默认情况下,启用SSL验证,如果无法验证SSL证书,将会引发SSLError:

result = reqests.get('https://kyfw.12306.cn/otn/login/init')
# requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)

为了避免出现这个错误,我们可以将CA证书的CA_BUNDLE文件或目录传递给verify参数里面:

result = reqests.get('https://kyfw.12306.cn/otn/login/init',verify='/path/...')

或者使用Session方式存储起来:

s = Session()
s.verify='/path/...'
result = s.get('https://kyfw.12306.cn/otn/login/init')

如果将verify参数设置为False,请求也可以忽略SSL证书:

result = requests.get('https://kyfw.12306.cn/otn/login/init',verify=False)

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现简单socket通信的方法
Apr 19 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
python文件排序的方法总结
Sep 13 Python
python 怎样进行内存管理
Nov 10 Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 #Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 #Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 #Python
Python延时操作实现方法示例
Aug 14 #Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 #Python
python 实现A*算法的示例代码
Aug 13 #Python
Python绘制KS曲线的实现方法
Aug 13 #Python
You might like
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
python修改文件内容的3种方法详解
2019/11/15 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
市场营销毕业生自荐信
2013/11/23 职场文书
我未来的职业规划范文
2014/01/11 职场文书
物理教学随笔感言
2014/02/22 职场文书
协议书格式
2014/04/23 职场文书
多媒体教室标语
2014/06/26 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
《角的度量》教学反思
2016/02/18 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
Redis实现分布式锁的五种方法详解
2022/06/14 Redis
Go语言编译原理之源码调试
2022/08/05 Golang