Python的request库应用

我是精神抖擞王大鹏,不卑不亢,和蔼可亲~
计算机硕士,目前小米大数据开发。日常会分享总结一些自己面试实际问题的回答,欢迎一起讨论。
公众号:diting_dapeng

Requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。

1. 发送http请求

为了使用requests,需要首先将requests库import进来:

import requests

然后,可以使用requests来发送http请求,例如发送get请求

r = requests.get('http://httpbin.org/ip')

执行此行代码,获得一个Response对象r,从r可以获取http请求的响应结果。

如果要发送post请求,则

r = requests.post('http://httpbin.org/post', data={'name': 'leo'})

2. 构造url

我们常常将http请求的参数以url的query string的形式进行发送,传统的做法是我们使用拼凑的方式构造这个url。例如我们需要构造以下这个url:

http://httpbin.org/get?key1=value1&key2=value2

使用reqeuets,你可以方便地构造这个url,而不用手工拼凑。你只需要将这些参数和值构造一个字典,然后将这个字典传给params参数即可:

d = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=d)
print (r.url)
输出
http://httpbin.org/get?key2=value2&key1=value1

这两个参数已被正确附加到url的query string中。

3. HTTP响应正文

一个http响应的格式通常如下:

响应行
响应报头
响应正文

注意:使用get()方法将得到一个response对象,从Response对象可获取响应正文的内容。

3.1 响应正文文本

使用Response.text,可以获取响应的正文文本内容。

r = requests.get('http://httpbin.org/ip')
print (r.text)
输出
{ 
“origin”: “218.107.63.234” 
}

Requests会自动对响应正文进行解码:如果Response.encoding为空,那么requests会猜测响应的编码方式,然后进行解码。如果你可以确定响应的编码方式,也可以先对Response.encoding进行设置,然后再通过Response.text获取响应正文。

3.2 二进制响应正文

使用Response.content可以获取响应正文的二进制字节内容。

通常情况下,取文本用.text,取图片等二进制的文件用.content,.text返回的是unicode型数据,.content返回的是bytes类型的数据,也就是二进制的数据。

3.3 Json响应正文

注意,网页的返回类型实际均为str类型
但是如果有的网页文本类型比较特殊时,是json格式,如果想直接解析返回结果,并得到一个字典格式的话,就可以直接调用json方法。
调用json方法,实际上是对响应正文进行json decode操作,就可以将返回结果是JSON格式的字符串转化为字典。
但要注意,如果返回的结果不是JSON格式,便会出现解析错误。

r = requests.get('http://httpbin.org/ip')
d = r.json()
print d
print (d['origin'])
输出:
{u’origin’: u’43.230.90.94’} 
u’43.230.90.94’

如果响应正文不是一个json串,则会报错。

4 响应状态

Response对象status_code属性标识http请求响应的状态码:

r = requests.get('http://httpbin.org/get')
print (r.status_code)

可以用响应状态来判断是否能取到数据,具体可以:

def get_html(url):
    try:
        headers = {
            'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Mobile Safari/537.36'
            }
        response = requests.post(url=url,headers=headers)
        # 更改编码方式,否则会出现乱码的情况
        response.encoding = "utf-8"
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

5. 响应的头部

Response对象的headers属性是一个字典,可以获得http响应结果的头部的相关信息:

r = requests.get('http://httpbin.org/headers')
print (r.headers)
输出:
{‘Content-Length’: ‘157’, ‘Server’: ‘nginx’, ‘Connection’: ‘keep-alive’, ‘Access-Control-Allow-Credentials’: ‘true’, ‘Date’: ‘Wed, 06 Jul 2016 15:53:36 GMT’, ‘Access-Control-Allow-Origin’: ‘*’, ‘Content-Type’: ‘application/json’}

6. 定制请求的头部

Requests支持定制http请求的头部。为此,我们只需要构造一个字典,然后传给requests.get()的headers参数即可。

url = 'http://httpbin.org/headers'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
print (r.text)

7. 发送POST请求

一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样:

请求行
请求报头
消息主体

HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式。服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括:

application/x-www-form-urlencoded
最常见post提交数据的方式,以form表单形式提交数据。
application/json
以json串提交数据。
multipart/form-data
一般使用来上传文件。

7.1 以form形式发送post请求

Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

url = 'http://httpbin.org/post'
d = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=d)
print (r.text)
输出:
{ 
“args”: {}, 
“data”: “”, 
“files”: {}, 
“form”: { 
“key1”: “value1”, 
“key2”: “value2” 
}, 
“headers”: { 
…… 
“Content-Type”: “application/x-www-form-urlencoded”, 
…… 
}, 
“json”: null, 
…… 
}

可以看到,请求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且d = {‘key1’: ‘value1’, ‘key2’: ‘value2’}以form表单的形式提交到服务端,服务端返回的form字段即是提交的数据。

7.2 以json形式发送post请求

可以将一json串传给requests.post()的data参数,

url = 'http://httpbin.org/post'
s = json.dumps({'key1': 'value1', 'key2': 'value2'})
r = requests.post(url, data=s)
print (r.text)
输出:

{ 
“args”: {}, 
“data”: “{\”key2\”: \”value2\”, \”key1\”: \”value1\”}”, 
“files”: {}, 
“form”: {}, 
“headers”: { 
…… 
“Content-Type”: “application/json”, 
…… 
}, 
“json”: { 
“key1”: “value1”, 
“key2”: “value2” 
}, 
…… 
}

可以看到,请求头的Content-Type设置为application/json,并将s这个json串提交到服务端中。

7.3 以multipart形式发送post请求

Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可。

url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print (r.text)
输出:

{ 
“args”: {}, 
“data”: “”, 
“files”: { 
“file”: “Hello world!” 
}, 
“form”: {}, 
“headers”: {…… 
“Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a”, 
…… 
}, 
“json”: null, 
…… 
}

文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。

8. Cookie设置

使用requests,可以轻松获取响应的cookies,和设置请求的cookies。

8.1 获取响应的cookies

r.cookies是响应cookies的字典,通过r.cookies可访问响应带上的cookies。

r = requests.get(url)
print (r.cookies['example_cookie_name'])

8.2 发送带cookies的请求

url = 'http://httpbin.org/cookies'
cookies = {'cookies_are': 'working'}
r = requests.get(url, cookies=cookies)
print (r.text)

9. 请求的超时设置

Requests允许对一个http请求设置超时的时间,只需要在requests.get()或者requests.post()方法的timeout参数设置一个值(单位为秒)即可。

url = 'http://httpbin.org/get'
r = requests.get(url, timeout=0.001)

将会抛出一个超时异常;

10. 异常

在发送http请求时,由于各种原因,requests可能会请求失败而抛出异常。常见的异常包括:
ConnectionError
由于网络原因,无法建立连接。
HTTPError
如果响应的状态码不为200,Response.raise_for_status()会抛出HTTPError 异常。
Timeout
超时异常。
TooManyRedirects
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
所有requests抛出的异常都继承自 requests.exceptions.RequestException类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精神抖擞王大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值