Coursera 笔记

Module 01 · Extract, Transform, Load (ETL)提取、转换与加载(ETL)

[Optional] REST APIs & HTTP Requests(可选)REST API 与 HTTP 请求

Coursera ↗

在本视频中,我们将讨论 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 示例:

  1. 我们定义了一个 payload 字典来创建查询字符串。键是参数名,值是查询字符串的值。
  2. 将字典 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() 方法对其进行格式化,它会返回一个 Python dict。
  • 键 'args' 包含查询字符串的名称和值。

2. POST 请求 (POST Request)

与 GET 请求类似,POST 请求也用于向服务器发送数据,但 POST 请求将数据发送在请求体 (Request Body) 中,而不是 URL 中。

  1. 在 URL 中,我们将路由更改为 /post。这个端点期待数据。
  2. 我们定义一个 payload 字典(与 GET 请求中的内容相同)。
  3. 要发起 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)。