requests库开发中常用的方法

本文介绍如何使用Python的Requests库发起GET和POST请求,包括请求参数、自定义请求头、处理响应等内容,并讲解了如何解析JSON响应及处理重定向等常见场景。
requests.get
# r是response对象
r = requests.get('www.baidu.com')
load = {'ie':'UTF-8', 'wd'='xxx'}
# 下面这种会在网址栏变成www.baidu.com?ie=UTF-8&wd=xxx
r = requests.get('www.baidu.com', params=load)
print(r.url)  # 打印实际组装的完整url
load2 = {'ie':'UTF-8', 'wd'=['xxx', 'yyy']}
r = requests.get('www.baidu.com', params=load2)
print(r.url) # www.baidu.com?ie=UTF-8&wd=xxx&wd=yyy
响应内容
r = requests.get('www.baidu.com')
print(r.text)
print(r.encoding)
# 下面重写编码方式
r.encoding = 'gbk'

print(r.content) # 响应内容为bytes数据,中文那些的会变成bytes

# 当你得到一张图片时,得到的就是bytes数据,如果想要得到图片本身
from PIL import Image
from io import BytesIO
img = Image.open(BytesIO(r.content))

# 可以通过内置的json进行json内容的获取
r = requests.get('www.baidu.com')
print(r.json()) # 此方法有可能会导致错误,因为返回内容不一定满足json解码的要求,相应的status_code为401

# 可以通过r.raw获取原始响应内容对象
r = requests.get('www.tencent.com', stream=True) # 不要忘记加上stream=True
print(r.raw.read(100)) # 读取前100个字节

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。
当然,你也可以改变响应内容的编码方式

定制请求头
r = requests.get('www.baidu.com', headers={'user-agent': 'my-app/0.0.1'}
print(r.headers)

定制 header 的优先级低于某些特定的信息源,例如:

  • 如果在 .netrc 中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth=参数,.netrc 的设置就无效了。
  • 如果被重定向到别的主机,授权 header 就会被删除。
  • 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
  • 在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。
requests.post
# 这里的data不会变成url中的query-string,而是会放在body里面
r = requests.post('www.baidu.com', data={'ie':'UTF-8', 'wd':'xxx'})
# 也可以下面这样传json字符串
r = requests.post('www.baidu.com', data=json.dumps({'ie':'UTF-8', 'wd':'xxx'}))
# 也可以下面这样
r = requests.post('www.baidu.com', json={'ie':'UTF-8', 'wd':'xxx'})

# 可以传输文件数据
r = requests.post('www.baidu.com', files={'file':('hwq.txt', open('hwq.txt', 'rb'))})

这里有个注意点就是:data不能直接传嵌套字典,json可以。

获取响应码
r = requests.get('www.baidu.com')
print(r.status_code)
print(r.status_code == requests.codes.ok) # 判断返回码是否等于200
# 如果r的响应码是4xx或者5xx,可以使用r.raise_for_status来抛出异常
r.raise_for_status()
# 如果没有错误你还是raise_for_status,会得到None
响应头
r = requests.get('www.baidu.com')
print(r.headers)
print(r.headers.get('content-type')
print(r.headers['Content-Type'])
cookies
# 获取cookies
r = requests.get('www.google.com')
print(r.cookies)
# 发送cookies到服务器
r = requests.get('www.google.com', cookies={'name':'hwq'})

重定向
r = requests.get('http://github.com')
print(r.status_code)
print(r.history) # 得到历史response对象
# 禁用重定向
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code)
print(r.history)
超时
# 超过2秒就会抛出超时异常
r = requests.get('http://github.com', timeout=2)

timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)If no timeout is specified explicitly, requests do not time out.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值