Python-第三方模块requests快速入手
首先确认一下
- Requests 已经安装
- Requests 是最新的版本
如果没有安装requests,请按照下面的方式安装
安装requests
window和Linux环境下都可以输入
$ pip install requests
发送请求
使用requests可以发送get、post、put、delete、head以及options等类型的Http请求
使用Requests发送网络请求非常简单,首先要导入Requests模块:
>>> import requests
然后,尝试获取某个网页
>>> r = requests.get('https://dc.kellyx.com:9635/match/games?pageNum=1&matchId=&countryId=')
>>> print(r.text)
传递URL参数
你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val
。 Requests 允许你使用 params
关键字参数,以一个字符串字典来提供这些参数。举例来说,如果你想传递 key1=value1
和 key2=value2
到 httpbin.org/get
,那么你可以使用如下代码:
- >>> payload = {"pageNum":1,"matchId":"","countryId":""}
>>> url = "https://dc.kellyx.com:9635/match/games"
>>>h = {- "Accept": "application/json,text/plain,*/*",
- "User-Agent": "Mozilla/5.0(Linux;Android6.0;Nexus 5Build/MRA58N) AppleWebKit/537.36(KHTML,likeGecko) Chrome/68.0.3440.106 Mobile Safari/537.36"
}
- >>> r = requests.get(url,params =payload,header=h)
通过打印输出该 URL,你能看到 URL 已被正确编码:
- >>> print(r.url)
注意字典里值为 None
的键都不会被添加到 URL 的查询字符串里。
你还可以将一个列表作为值传入:
- >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
- >>> r = requests.get('http://httpbin.org/get', params=payload)
- >>> print(r.url)
- http://httpbin.org/get?key1=value1&key2=value2&key2=value3
响应内容
我们能读取服务器响应的内容,
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text
之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用r.encoding
属性来改变它:
- >>> r.encoding
- 'utf-8'
- >>> r.encoding = 'ISO-8859-1'
其他操作
response的返回内容还有其它更多信息
>>> r.status_code #响应状态码
>>> r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
>>> r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
>>> r.url # 获取url
>>> r.encoding # 编码格式
>>> r.cookies # 获取返回的cookie
>>> r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
>>> r.raise_for_status() #失败请求(非200响应)抛出异常
>>> r.json() #Requests中内置的JSON解码器 ,json转成python的字典了
如果 JSON 解码失败, r.json()
就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json()
将会抛出 ValueError: No JSON object could be decoded
异常。
需要注意的是,成功调用 r.json()
并**不**意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status()
或者检查 r.status_code
是否和你的期望相同。
定制请求头
如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict
给 headers
参数就可以了。
例如,在前一个示例中我们没有指定 content-type:
- >>> url = 'https://api.github.com/some/endpoint'
- >>> headers = {'user-agent': 'my-app/0.0.1'}
- >>> r = requests.get(url, headers=headers)
注意: 定制 header 的优先级低于某些特定的信息源,例如:
- 如果在
.netrc
中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了auth=
参数,``.netrc`` 的设置就无效了。 - 如果被重定向到别的主机,授权 header 就会被删除。
- 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
- 在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。
更进一步讲,Requests 不会基于定制 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去。
注意: 所有的 header 值必须是 string
、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做。
更加复杂的 POST 请求
带有参数的Post请求的样式主要有两个类型,一类是参数在URL中,一类是在body中。
常见的四类形式:
- application/json: {“key1“:”value1”,“keyt2":“value2"}
- application/x-www-form-urlencoded:name1= value1&name2=value2
- multipart/form-data:这一种是表单格式的(文件上传,图片上传等混合式)
- Content-Type:octets/stream(文件下载)
通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
- >>> payload = {'key1': 'value1', 'key2': 'value2'}
- >>> r = requests.post("http://httpbin.org/post", data=payload)
- >>> print(r.text)
- {
- ...
- "form": {
- "key2": "value2",
- "key1": "value1"
- },
- ...
- }
你还可以为 data
参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,这种方式尤其有效:
- >>> payload = (('key1', 'value1'), ('key1', 'value2'))
- >>> r = requests.post('http://httpbin.org/post', data=payload)
- >>> print(r.text)
- {
- ...
- "form": {
- "key1": [
- "value1",
- "value2"
- ]
- },
- ...
- }
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string
而不是一个 dict
,那么数据会被直接发布出去。
例如,Github API v3 接受编码为 JSON 的 POST/PATCH 数据:
- >>> import json
- >>> url = 'https://api.github.com/some/endpoint'
- >>> payload = {'some': 'data'}
- >>> r = requests.post(url, data=json.dumps(payload))
此处除了可以自行对 dict
进行编码,你还可以使用 json
参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:
- >>> url = 'https://api.github.com/some/endpoint'
- >>> payload = {'some': 'data'}
- >>> r = requests.post(url, json=payload)
POST一个多部分编码(Multipart-Encoded)的文件
Requests 使得上传多部分编码文件变得很简单:
- >>> url = 'http://httpbin.org/post'
- >>> files = {'file': open('report.xls', 'rb')}
- >>> r = requests.post(url, files=files)
- >>> r.text
- {
- ...
- "files": {
- "file": "<censored...binary...data>"
- },
- ...
- }
你可以显式地设置文件名,文件类型和请求头:
- >>> url = 'http://httpbin.org/post'
- >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
- >>> r = requests.post(url, files=files)
- >>> r.text
- {
- ...
- "files": {
- "file": "<censored...binary...data>"
- },
- ...
- }
如果你想,你也可以发送作为文件来接收的字符串:
- >>> url = 'http://httpbin.org/post'
- >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
- >>> r = requests.post(url, files=files)
- >>> r.text
- {
- ...
- "files": {
- "file": "some,data,to,send\\nanother,row,to,send\\n"
- },
- ...
- }
如果你发送一个非常大的文件作为 multipart/form-data
请求,你可能希望将请求做成数据流。默认下 requests
不支持, 但有个第三方包 requests-toolbelt
是支持的。
Python-第三方模块requests快速入手的更多相关文章
- Python第三方模块--requests简单使用
1.requests简介 requests是什么?python语言编写的,基于urllib的第三方模块 与urllib有什么关系?urllib是python的内置模块,比urllib更加简洁和方便使用 ...
- python第三方模块精选
python不但有着强大丰富的“内置电池”,同样的,第三方模块也是非常的多.目前收集了requests.paramiko.pymsql,以后会陆续添加: 一.requests Python标准库中提供 ...
- python第三方库requests简单介绍
一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...
- Python基础之模块:5、 第三方模块 requests模块 openpyxl模块
目录 一.第三方模块的下载与使用 1.什么是第三方模块 2.如何安装第三方模块 方式一:pip工具 方式二:pycharm中下载 3.注意事项 1.报错并有警告信息 2.报错,提示关键字 3.报错,无 ...
- 详解:Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests
在python2中,urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.urllib2可以接受一个Request类的实例来设置URL请求的hea ...
- 常用的第三方模块 requests url
我们已经讲解了Python内置的urllib模块,用于访问网络资源.但是,它用起来比较麻烦,而且,缺少很多实用的高级功能. 更好的方案是使用requests.它是一个Python第三方库,处理URL资 ...
- Linux 下 安装Python第三方模块工具箱pip,以及用pip安装的方法
下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 可以做一个软连 ...
- python第三方模块的导入
模块搜索路径 当我们尝试加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错: >>> import module1 Traceback (most ...
- psutil——获取系统信息的Python第三方模块
本文摘自廖雪峰大神个人网站:https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984 用Python来编写脚本简化日常的运维 ...
随机推荐
- Hadoop HDFS NameNode工作机制
Secondary namenode 首先,我们假设如果存储在Namenode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低.因此,元数据需要存放在内存中.但如果只存在内存中 ...
- 支付宝内部功能调用APP的said说明
追加: 支付宝收款码 alipayqr://platformapi/startapp?saId=20000123 微信扫一扫 weixin://scanqrcode (跳转微信扫一扫) 支付宝扫一 ...
- CheckFail设计很垃圾
function checkFail(node, onError, fuckIE) { var id = node.src;//检测是否死链 node.onlo ...
- ToString()、Convert.ToString()、(string)、as string 的区别
通常 object 到 string 有四种方式(假设有object obj):obj.ToString().Convert.ToString().(string)obj.obj as string. ...
- [蓝桥杯]ALGO-79.算法训练_删除数组零元素
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数 ...
- QQ在开发中的应用
1 截图 2 快捷回复 1svn更新 2美术资源替换 3后端服务器模块确认 4开会吧 5策划更新
- 【Web前端】清除css、javascript及背景图在浏览器中的缓存
在实际项目开发过过程中,页面是上传到服务器上的.而为了减少服务器的压力,让用户少加载,浏览器会将图片.css.js缓存到本地中,以便下次访问网站时使用.这样做不仅减少了服务器的压力,并且也减少了用户的 ...
- 服务容错保护断路器Hystrix之七:做到自动降级
从<高可用服务设计之二:Rate limiting 限流与降级>中的“自动降级”中,我们这边将系统遇到“危险”时采取的整套应急方案和措施统一称为降级或服务降级.想要帮助服务做到自动降级,需 ...
- python 数组或列表维度增加
怎么把[,,,,]变成[[],[],[],[],[]]???
- 廖雪峰Java3异常处理-1错误处理-1Java的异常
1.计算机运行中的错误 在计算机程序运行的过程中,错误总会出现,不可避免的 用户输入错误 读写文件错误 网络错误.内存耗尽.无法连接打印机不可 String s = "abc"; ...