requests 官方文档:

http://cn.python-requests.org/zh_CN/latest/user/quickstart.html

request 是一个第三方的HTTP库

1.发起请求

发起GET请求非常简单,直接使用requests的get方法即可。比方说下面的代码获取百度首页的信息。

 import requests

 baidu_url = 'https://www.baidu.com'

 response = requests.get(baidu_url)
print(response.content.decode())
如果要在URL上附加参数,也非常简单,使用params参数传入字典即可。参数会自动附加到URL上,列表参数也会正确的附加。这里这个网站是一个HTTP调试网站,值得收藏。如果我们访问这个网站,它会将浏览器发送的请求头,用户代理、表单参数等信息以格式化JSON形式返回,对HTTP调试非常有帮助。
 #基本Get请求
r = requests.get('http://httpbin.org/get')
#如果要加参数,可以利用params参数
payload = {'key1':'values','key2':'valus'}
r = requests.get('http://httpbin.org/get',params=payload)
print r.url

其他常用的HTTP操作例如PUT、DELETE、HEAD、OPTIONS等也支持,调用相应方法即可。

获取结果

发起请求之后,返回值是一个Response对象,利用它我们可以方便的获取结果。

响应对象的常用属性和方法如下。

属性名 结果
text HTTP字符
encoding 响应编码,这个值可以改变,改变之后text属性也会根据编码而变化
content 未编码的二进制数据
json() 返回JSON数据
raw 结果的原始字节流
url 请求的URL
status_code 状态码
headers 请求头字典
cookies cookies字典
history 如果发生重定向,所有请求对象都会保存到这里
r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常

自定义header

如果要在请求上添加请求头,也非常简单。有些网站对客户端的限制比较严格,所以我们必须伪装header。

 #如果想添加headers 可以传入headers参数
2 headers = {'content-type':'application/jason'}
3 r = requests.get('http://httpbin.org/get',headers = headers)
4 print r.url

假如使用自带的urllib标准库,那么代码就比较复杂了。从这里我们可以看到requests确实非常方便。

headers = {'content-type':'application/jason'}
r = urllib2.request(url,headers = headers)
response = urllib2.urlopen(r)
print response.read().decode()

POST数据

如果我们要发送复杂的表单,就需要POST数据了。和GET传送数据一样,想方法中额外添加一个data参数的事儿。这种方式相当于你在表单中填写这些数据,然后点击表单的提交。

data = {
'name': 'yitian',
'age': 22,
'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=data)
print(response.text)

有时候POST数据不是使用表单方式,而是直接在请求体中附加参数。那么我们在发送参数的时候不能向data参数添加字典了,而应该传递字符串。

import json

data = {
'name': 'yitian',
'age': 22,
'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=json.dumps(data))
print(response.text)

备注: json的几个常用方法 json.load(), json.dump() ,json.loads(), json.dumps()

json.loads() : 将json结构转变成Python数据结构

json.dumps():将Python数据结构转变成json结构

json.load(): 读取json文件转成Python数据结构

json.dumps():写入jason文件

参考自: https://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

有些程序(例如Github的API)需要将JSON字符串直接当做请求体发送,比如说上面这种将字典转换为JSON的例子。在这种情况下,我们可以直接将字典的引用传递给方法的json参数,这样就不需要我们手动转换,requests会自动转换。

response = requests.post(f'{base_url}post', json=data)

上传文件

在网页上,上传头像等操作都需要上传multipart/form-data类型的表单。使用requests也非常简单。需要注意打开文件的时候最好使用二进制模式,使用文本模式打开文件可能导致requests不能正确计算文件的大小。

file = open(r'c:\Windows\System32\drivers\etc\hosts', mode='rb')

data = {
'file': file
} response = requests.post(f'{base_url}post', files=data)
print(response.text)
#requests 支持流失上传的,允许发送大的数据流或文件而无需先把他读入内存。需使用流式上传
with open('massive-body') as f:
requests.post('http://some.url/streamed',data=f)

cookies

如果要获取响应的cookies,调用cookies属性即可,它会返回一个RequestsCookieJar对象,它实现了标准库的http.cookiejar。所以我们可以按照cookiejar的方法来使用RequestsCookieJar。比如说访问百度的时候,它会分配一个cookie,所以我们可以使用下面的代码获取Cookie。

response = requests.get(baidu_url)
print(response.cookies)

如果要在发送数据的时候向服务器传递cookie,需要实例化一个RequestsCookieJar,然后传递给发送方法的cookies参数。

import requests.cookies

cookies = requests.cookies.RequestsCookieJar()
cookies.set('name', 'yitian')
response = requests.get(f'{base_url}cookies', cookies=cookies)
print(response.text)

以上就是requests的快速入门。具体的高级应用可以参考官方文档。

最新文章

  1. ADO.net操作数据库
  2. getopt解析命令行参数一例:汇集多个服务器的日志
  3. JAVA设计模式之迭代子模式
  4. JDK的命令行工具
  5. Codeforces Round #313 (Div. 2) A. Currency System in Geraldion 水题
  6. winform DataGridView双击修改单元格的值 分类: DataGridView 2014-08-04 19:39 150人阅读 评论(0) 收藏
  7. git语言
  8. 跨服务器查询sql语句样例
  9. ThinkPHP - 自动创建 + 自动验证 + 自动完成
  10. osap一站式分析模型
  11. mysql中出现Unknown column 'qwe' in 'field list'的错误
  12. router-link RangeError: Maximum call stack size exceeded
  13. ansible的modules
  14. SQL语句中不同的连接JOIN
  15. 流程控制:顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for ..
  16. OO第一次博客作业(第一单元总结)
  17. Get The Treasury HDU - 3642(体积扫描线)
  18. 2019.01.19 codeforces893F.Subtree Minimum Query(线段树合并)
  19. JS异常简单处理
  20. ADT Bundle下载和安装

热门文章

  1. Flex scroller皮肤的使用
  2. Mysql更改表名大小写不敏感
  3. 使用xshell远程连接
  4. 在项目中使用react
  5. AVL平衡二叉树的各种问题(Balanced Binary Tree)
  6. python记录_day019 类的约束 异常处理 日志
  7. 『计算机视觉』经典RCNN_其一:从RCNN到Faster-RCNN
  8. ansible管理windows (发送文件)
  9. java骰子求和算法
  10. Thirft框架介绍