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在不同层级目录import模块的方法
Jan 31 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
tensorflow 使用flags定义命令行参数的方法
Apr 23 Python
python实现随机梯度下降法
Mar 24 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
用Python写一个自动木马程序
Sep 17 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
python中urllib包的网络请求教程
Apr 19 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中的字符串函数
2006/10/09 PHP
PHP简介
2006/10/09 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
Python 切分数组实例解析
2019/11/07 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
python设置表格边框的具体方法
2020/07/17 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
一年级班主任寄语
2014/01/19 职场文书
工程承包协议书
2014/04/22 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2015年采购工作总结
2015/04/10 职场文书
雾霾停课通知
2015/04/24 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers