requests库开发中常用的方法

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值