本文最后更新于 2024-07-29,文章内容可能已经过时。

Requests是什么

Requests是一个优雅且简洁的HTTP库,专门设计用于发送各种类型的HTTP请求。

Requests库构建在Python的标准库urllib之上,提供了更简洁、更人性化的接口。

requests的作用
  • 发送http请求和处理响应

  • 自动处理重定向、会话管理、身份验证、代理设置

搭建requests环境

安装:

pip install requests

requests的基本使用

使用requests很简单,只需三步:

  1. 发送请求

  2. 传递参数

  3. 处理响应

发送请求

请求分类

常用的几种接口请求方式:

  • GET:从指定资源获取数据,对应requests.get()方法

  • POST:向指定的资源请求被处理的数据(例如用户登录),对应requests.post()方法

  • PUT:上传指定的 URL,一般是修改,可以理解为数据库中的 update,对应requests.put()方法

  • DELETE:删除指定资源,对应requests.delete()方法

GET请求和POST请求的区别

  • GET请求:通过URL参数传递数据,数据以明文形式出现在URL中,因此不适合传输敏感信息。GET请求通常用于获取资源,比如网页、图片等。

  • POST请求:通过请求体传递数据,数据以密文形式传输,因此更安全,适合传输敏感信息。POST请求通常用于向服务器提交数据,比如用户登录、提交表单等。

import requests # 导入模块
# 向百度发送一个get请求
r = requests.get('https://www.baidu.com')

上例代码中,通过requests.get()方法获得了一个名为rResponse对象,我们可以从这个对象中获取我们需要的所有信息。

发送其他类型的请求也是这样

# data 是传递的参数
r = requests.post('https://httpbin.org/post', data={'key': 'value'})
r = requests.put('https://httpbin.org/put', data={'key': 'value'})
r = requests.delete('https://httpbin.org/delete')
r = requests.head('https://httpbin.org/get')
r = requests.options('https://httpbin.org/get')

请求参数

关键字

参数信息

示例

headers

请求头

headers = {'user-agent': 'my-app/0.0.1'}

cookies

cookie信息

cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)

timeout

设置超时时间

requests.get('https://github.com/', timeout=0.001)

传递参数

通过requests请求可以传递请求数据参数

数据参数的传递形式

  • 字典形式的参数:payload = {'key1': 'value1', 'key2': 'value2'}

  • 元组形式的参数:payload = (('key1', 'value1'), ('key2', 'value2'))

  • 字符串形式的参数:payload = {'string1', 'value1'}

  • 多部份编码的文件:files = {
    # 显示设置文件名、文件类型和请求头
    'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
    }

URL参数
  • params

params参数将会在 URL 中以键/值对的形式给出,并在问号后给出,例如 httpbin.org/get?key=val

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('https://httpbin.org/get', params=payload)

还可以将项目列表作为值传递:

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('https://httpbin.org/get', params=payload)
print(r.url)
# https://httpbin.org/get?key1=value1&key2=value2&key2=value3

注意,值为 None 的任何字典键都不会添加到 URL 的查询字符串中

请求体参数
  • data

需要发送一些表单数据,只需将字典传递给 data 参数

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('https://httpbin.org/post', data=payload)

print(r.text)
# {
#   ...
#   "form": {
#     "key2": "value2",
#     "key1": "value1"
#   },
#   ...
# }

data 参数还可以为每个键具有多个值。这可以通过使数据成为元组列表或以列表作为值的字典来完成。当表单具有使用相同键的多个元素时,这特别有用

payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
payload_dict = {'key1': ['value1', 'value2']}
r2 = requests.post('https://httpbin.org/post', data=payload_dict)
print(r1.text)

如果需要发送非表单的数据,传入字符串则该数据将直接发送

import json

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}

r = requests.post(url, data=json.dumps(payload))

  • JSON

如果需要发送json数据,可以使用json参数

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)

file文件参数
  • file

支持传递一个多部分编码的文件

url = 'https://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

# 可以显式设置文件名、content_type和标题
url = 'https://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)

处理响应

获取响应体

响应体包含了服务器返回的实际数据内容。你可以通过text属性来获取响应体的文本内容,或者使用content属性获取二进制内容。

import requests
# 发送GET请求
response = requests.get('http://www.baidu.com')
# 获取响应体文本内容
body_text = response.text
# 获取响应体二进制内容
body_binary = response.content
# 打印响应体文本内容
print("响应体文本内容:", body_text)
# 打印响应体二进制内容
print("响应体二进制内容:", body_binary)

获取响应码

使用status_code属性可以获取请求响应状态码

import requests
# 发送GET请求
response = requests.get('http://www.baidu.com')
# 打印响应状态码
print("响应状态码:", response.status_code)

常见状态码信息

  • 1xx:指示信息,表示请求已接收,继续处理。

  • 2xx:成功,表示请求已被成功接收、理解、接受。

  • 200 OK //客户端请求成功

  • 3xx:重定向,要完成请求必须进行更进一步的操作。

  • 300 多种选择

  • 301 临时移动

  • 302 永久移动

  • 304 所请求的资源未修改

  • 4xx:客户端错误,请求有语法错误或请求无法实现。

  • 400 错误请求

  • 401 未授权

  • 402 预留或支付

  • 403 请求被拒

  • 404 资源未找到

  • 5xx:服务端错误,服务器未能实现合法的请求。

  • 500 服务器内部错误

  • 501 尚未实施,不能完成请求内容的功能

  • 502 错误网关,server作为网关或代理,收到上游server的无效响应

  • 503 服务不可用,临时维护等

  • 504 请求网关超时

  • 505 HTTP版本不支持

获取JSON响应内容

内置的 JSON 解码器,可以处理json格式的响应数据

import requests

r = requests.get('https://api.github.com/events')
print(r.json())
  • r.json() 的调用成功并不表示响应成功。某些服务器可能会在失败的响应中返回 JSON 对象

  • 使用 r.raise_for_status() 或检查r.status_code是否符合您的预期

获取原始响应内容

在极少数情况下,需要从服务器获取原始套接字响应,可以使用r.raw

如果要执行此操作,请确保在初始请求中设置 stream=True

r = requests.get('https://api.github.com/events', stream=True)

r.raw
<urllib3.response.HTTPResponse object at 0x101194810>

r.raw.read(10)
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
其他参数

关键字

信息

示例

encoding

设置响应编码

r.encoding = 'ISO-8859-1'

headers

获取响应头

获取所有:r.headers 指定标头:r.headers['Content-Type']

cookies

获取cookie信息

r.cookies['example_cookie_name']

history

跟踪重定向

r.history

错误和异常

  • 如果出现网络问题(例如 DNS 故障、连接被拒绝等),请求将引发 ConnectionError 异常。

  • 如果 HTTP 请求返回了不成功的状态代码,则将引发 HTTPError

  • 如果请求超时,则会引发 Timeout 异常。

  • 如果请求超过配置的最大重定向数,则会引发 TooManyRedirects 异常。

  • Requests 显式引发的所有异常都继承自 requests.exceptions.RequestException