Module 01 · Extract, Transform, Load (ETL)提取、转换与加载(ETL)
[Optional] REST APIs & HTTP Requests(可选)REST API 与 HTTP 请求
在本视频中,我们将讨论 HTTP 协议,并使用流行的 Requests 库来处理 Python 中的 HTTP 协议。
学习要点
本视频将回顾 Python 的 Requests 库,用于处理 HTTP 协议,并概述:
- GET 请求 (Get Requests)
- POST 请求 (Post Requests)
Python Requests 模块概述
Requests 是 Python 中处理 HTTP 协议的库之一,与 httplib、urllib 等库类似。
Requests 是一个 Python 库,允许您轻松发送 HTTP/1.1 请求。
库的导入与使用
我们可以通过以下方式导入该库:
import requests
1. GET 请求 (GET Request)
我们可以通过 get 方法向 www.ibm.com 发送一个 GET 请求:
r = requests.get('http://www.ibm.com')
响应对象r的信息
响应对象 r 包含有关该请求的信息,例如请求的状态:
| 属性/键 | 作用 | 示例值 |
|---|---|---|
r.status_code |
查看状态码 | 200 (表示 OK) |
r.request.headers |
查看请求头 | Python 字典格式 |
r.request.body |
查看请求体 | 对于 GET 请求,值为 None |
r.headers |
查看 HTTP 响应头 | Python 字典格式 |
r.headers['Date'] |
获取请求发送日期 | - |
r.headers['Content-Type'] |
指示数据类型 | 例如 text/html; charset=utf-8 |
r.encoding |
检查响应编码 | 例如 utf-8 |
r.text |
显示 HTML 正文 | 当 Content-Type 为 text/html 时使用,可显示前 100 个字符 |
使用 GET 请求发送查询字符串
您可以使用 GET 方法来修改查询结果,例如从 API 检索数据。
在本例中,我们将使用 httpbin.org 提供的简单 HTTP 请求和响应服务。
我们向服务器发送一个 GET 请求,在基本 URL (Base URL) 后的路由 (Route) 中附加 /get:
| URL 组成部分 | 示例 | 描述 |
|---|---|---|
| 基本 URL | http://httpbin.org |
网站地址 |
| 路由 | /get |
指示执行 GET 请求 |
| 查询字符串 | ?name=Joseph&ID=123 |
发送到 Web 服务器的附加信息 |
查询字符串 (Query String) 是统一资源定位符 (URL) 的一部分,用于发送附加信息。
- 查询字符串以
?开头。 - 后面是一系列参数和值对。
- 每个参数和值对之间用等号
=分隔。 - 多个参数和值对之间用和号
&分隔。
Python 示例:
- 我们定义了一个
payload字典来创建查询字符串。键是参数名,值是查询字符串的值。 - 将字典
payload传递给get()函数的params参数。
# 1. 定义 payload 字典
payload = {'name': 'Joseph', 'ID': '123'}
# 2. 发送 GET 请求
r = requests.get('http://httpbin.org/get', params=payload)
- 我们可以打印出
r.url,查看名称和值是否已附加到 URL 中。 r.request.body的值为None,因为信息是通过 URL 发送的。r.status_code仍然是 200。- 由于
Content-Type在响应中是 JSON 格式,我们可以使用r.json()方法对其进行格式化,它会返回一个 Pythondict。 - 键
'args'包含查询字符串的名称和值。
2. POST 请求 (POST Request)
与 GET 请求类似,POST 请求也用于向服务器发送数据,但 POST 请求将数据发送在请求体 (Request Body) 中,而不是 URL 中。
- 在 URL 中,我们将路由更改为
/post。这个端点期待数据。 - 我们定义一个
payload字典(与 GET 请求中的内容相同)。 - 要发起
POST请求,我们使用post()函数,并将变量payload传递给data参数。
# 1. 定义 payload 字典
payload = {'name': 'Joseph', 'ID': '123'}
# 2. 发送 POST 请求
r_post = requests.post('http://httpbin.org/post', data=payload)
GET 与 POST 的比较
| 特性 | GET 请求 | POST 请求 |
|---|---|---|
| 数据发送位置 | URL(作为查询字符串) | 请求体 (Request Body) |
r.url |
URL 中包含名称/值对 | URL 中不包含名称/值对 |
r.request.body |
None |
包含发送的数据 |
通过 r_post.json() 的响应,我们可以查看 键 form,以获取请求体中发送的负载 (payload)。