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中关于使用模块的基础知识
May 24 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
利用python代码写的12306订票代码
Dec 20 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 Python
python编写微信公众号首图思路详解
Dec 13 Python
Python终端输出彩色字符方法详解
Feb 11 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 Python
python实现监听键盘
Apr 26 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数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php短网址和数字之间相互转换的方法
2015/03/13 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
零基础php编程好学吗
2019/10/11 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
封装的原生javascript弹出层代码
2010/09/24 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
中止javascript执行的方法
2014/02/14 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
Python实现端口检测的方法
2018/07/24 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
五好党支部事迹材料
2014/02/06 职场文书
党员创先争优活动总结
2014/05/04 职场文书
岗位职责说明书
2014/05/07 职场文书
党员公开承诺书内容
2014/05/20 职场文书
十佳青年事迹材料
2014/08/21 职场文书
三峡大坝导游词
2015/01/31 职场文书