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 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python的Flask框架与数据库连接的教程
Apr 20 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
django表单的Widgets使用详解
Jul 22 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
python中for循环变量作用域及用法详解
Nov 05 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
详解python中的lambda与sorted函数
Sep 04 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
Python实现双向链表
May 25 Python
python实现学员管理系统(面向对象版)
Jun 05 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 日常开发小技巧
2009/09/23 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
利用Python实现命令行版的火车票查看器
2016/08/05 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
公司委托书范本
2014/04/04 职场文书
服务承诺口号
2014/05/22 职场文书
年终考核实施方案
2014/05/26 职场文书
节能减耗标语
2014/06/21 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python