Requests 是 Python 中最流行的与 Web 服务器交互的库。它允许你像使用浏览器一样发送 HTTP 请求,但更高效且支持自动化。
本指南将涵盖 Requests 提供的各种选项和功能。你将学习如何使用 Python 向 Web 页面和 JSON API 发送请求,以及 HTTP 状态代码、HTTP 方法、查询参数、代理是什么,以及如何在 Requests 中使用它们。
什么是Python Requests 库?
Requests 是一个简单易用的 Python HTTP 客户端库。它用于向服务器发送 HTTP 请求并接收响应。
该库的工作方式类似于 Web 浏览器。实际上,浏览器是最常见的 HTTP 客户端。但它们是为视觉浏览网站而设计的,而不是为自动请求信息而设计的。
因此,开发者使用像 Requests 这样的库。它们的工作方式类似于浏览器,但你不需要将响应图形化呈现,这节省了大量处理能力。此外,它们还具有额外的功能来自动化你的工作。
安装 Python Requests 库
要在 Python 中使用 Requests 库,首先需要安装它。这可以使用以下命令完成:
pip install requests
之后,您可以导入库以在Python代码中使用。要导入该库,你需要在Python文件的顶部添加以下内容:
import requests
向Web页面发送HTTP请求
让我们从库开始,并尝试使用请求来下载网页。首先,创建一个名为example.py的新文件,并在代码编辑器中打开它。然后粘贴如下内容:
import requests response = requests.get("https://www.google.com/") print(response.text)
如果使用python3 requests.py运行脚本,它将打印出Google主页后面的HTML代码。
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="lv"><head>...
这是库的主要功能。你可以使用它向 Web 页面发送请求并接收响应。在这种情况下,你向服务器请求了一个 Web 页面,它将其作为响应返回给你。
不幸的是,Python Requests 库不具备内置的解析功能来处理收到的 HTML 并找到你需要的东西。为此,你需要使用另一个库。最常用的选择是 Beautiful Soup。
我们不会在本教程中涵盖如何做到这一点,但你可以阅读我们的 Python 网页抓取指南,以了解如何使用 Requests 和 Beautiful Soup 自动从网站中提取信息。
使用 Requests 与 JSON API
HTML 页面不是你可以使用 Requests 库的唯一资源。另一种常用的资源格式是 JSON(JavaScript 对象表示法)。
以下是一个包含产品信息的示例 JSON 消息:
( { 'id': 1, 'title': 'iPhone 9', 'description': 'Quite a nice smartphone.', 'price': 549, 'discountPercentage': 12.96, 'rating': 4.69, 'stock': 94, 'brand': 'Apple', 'category': 'smartphones', }
HTML用于网页,因为它们需要以图形方式呈现。相比之下,JSON更常用于API。API是服务可以从另一个服务请求信息的连接点。与HTML相反,返回的信息是结构化的,供计算机使用,而不是供人类使用。
例如,你可以从DummyJSON调用模拟API,该API提供了一个包含各种产品的假数据集,可用于测试目的。
response = requests.get("https://dummyjson.com/products") response_json = response.json()
这一次,你需要调用.json()方法,而不是读取响应的文本属性。它会将响应转换为你可以轻松交互的Python数据类型-列表和字典的组合。
如果你打印响应,将能够查看API提供的数据,并只选择你需要的内容。
print(response_json) # {'products': [{'id': 1, 'title': 'iPhone 9', 'description': 'An apple mobile which is nothing like apple',...
例如,如果你只想打印出产品的标题和价格,你可以首先通过“products”键访问产品列表,然后像这样遍历其中的项目:
response = requests.get("https://dummyjson.com/products") response_json = response.json() products = response_json["products"] for product in products: print(f'{product["title"]} - - - {product["price"]}')
运行上面的代码应该会返回如下的产品列表:
iPhone 9 - - - 549
iPhone X - - - 899
Samsung Universe 9 - - - 1249
OPPOF19 - - - 280
Huawei P30 - - - 499
MacBook Pro - - - 1749
查询参数
当你使用 DummyJSON 的模拟产品 API 时,你收到了包含 30 个项目的响应。但是,根据网站,该 API 可以提供关于 100 个不同项目的信息。
要访问其他 70 个产品,你可以使用查询参数。API 经常允许开发者添加额外的参数以根据需要更改响应的内容。这些参数列在 URL 的末尾,紧跟在问号 (?) 字符之后。如果有多个参数,在这种情况下,它们将被 & 分隔。
例如,你可以使用以下 URL 来获取所有 100 个产品的信息。
但是,手动构建 URL 或连接字符串可能会导致错误和难看的代码。
Requests 允许你向请求提供一个 params 字典。如果你这样做,库将在发出请求时自动将查询参数添加到 URL 的末尾。
response = requests.get( "https://dummyjson.com/products", params={'limit': 100} )
这使得更改查询参数或添加新参数变得更加容易。
HTTP 状态代码
服务器的响应不仅包含我们请求的信息,还包含一些关于响应内容的有用元信息。
你应该注意的一个项目是响应的状态代码。一个成功的响应将具有 200 的状态代码。
response = requests.get( "https://dummyjson.com/products", params={'limit': 100} ) # Returns "200" print (response.status_code)
如果你尝试访问不存在的资源,将获得404状态码。在这种情况下,响应的内容不包含你需要的内容。
response = requests.get( "https://dummyjson.com/unicorns", params={'limit': 100} ) # Returns "404" print(response.status_code)
这是你将遇到的两个最常见的代码,但还有更多。你可以在MDN网络文档上了解更多。
HTTP 方法
HTTP 协议规定了一组方法,HTTP 请求可以使用。到目前为止,你只发送了 GET 请求,请求某个资源。
但是,你也可以使用 HTTP 客户端库通过 POST 方法将信息发送到服务器。或者,你可以使用 DELETE 方法删除服务器上的项目。
Requests 提供了与 HTTP 方法同名的 Python 方法来执行这些操作。
例如,你可以使用 Requests 将一双新的运动鞋提交到 DummyJSON 的产品 API。(由于这是一个模拟 API,所以当然不会显示给其他用户。)
下面是包含关于运动鞋信息的 Python 字典:
{ 'id': 101, 'title': 'Limited edition sneakers', 'description': 'Sneakers to die for.', 'price': 200, 'discountPercentage': 12, 'rating': 4.85, 'stock': 25, 'brand': 'Snike', 'category': 'footwear', 'thumbnail': 'https://i.dummyjson.com/data/products/101/thumbnail.jpg', 'images': ['https://i.dummyjson.com/data/products/101/1.jpg', 'https://i.dummyjson.com/data/products/101/2.jpg', 'https://i.dummyjson.com/data/products/101/3.jpg', 'https://i.dummyjson.com/data/products/101/thumbnail.jpg'] }
你可以通过POST请求发送它,像这样:
response = requests.post( "https://dummyjson.com/products/add", json=limited_sneakers )
如果我们通过json参数提供字典,库将自动将其转换为json。
类似地,你可以使用requests.delete()方法删除项。
response = requests.delete( "https://dummyjson.com/products/100" )
使用 Requests 时如何使用代理IP
Python Requests 库可以用于多种目的:联系自己的 HTTP 服务器、消费互联网上的 API 以及抓取网页。
如果你正在联系别人的服务器,可能会出现你想要隐藏 IP 地址的情况。通常,这发生在抓取网页时,因为许多站点管理员不喜欢这种行为。API 是为自动消费而设计的,因此在那里允许更多的操作。然而,你也可能会遇到 API 使用限制。
对于这些情况,代理是一个很好的解决方案,可以隐藏请求的来源。通过将代理添加到请求中,它将首先将请求路由到不同的 IP 地址,然后从那里将其发送到服务器。
将代理添加到 Requests 请求非常简单。接下面我们将以 IPRoyal 住宅代理为例来进行介绍。它们提供了一个单一的 URL 来联系,该 URL 在每个请求时都会旋转 IP,这使得设置变得快速和简单。
首先,你需要找到连接到代理的链接,可以在客户区域的仪表盘中找到它。
找到链接后,需要创建一个字典来保存它。
proxies = { 'http': 'http://link-to-proxy.com', 'https': 'http://link-to-proxy.com' }
然后,你可以将字典提供给request .get()函数的代理参数。
response = requests.get( "https://dummyjson.com/products", proxies=proxies )
这将确保你的IP对接收请求的服务器保持匿名。
身份验证
一些网页可能隐藏在授权障碍之后。
如果你拥有访问这些页面的凭据,可以将它们添加到发送的请求中,以便访问页面。
请求函数具有一个名为 auth 的参数,该参数启用了对身份验证的支持,包括 HTTP 基本、HTTP 摘要、OAuth 等选项。
身份验证方法由 Python 类(HTTPBasicAuth、HTTPDigestAuth 等)表示。要使用 HTTP 身份验证,需要从 requests.auth 导入相应的类。
from requests.auth import HTTPBasicAuth Then you need to create an object with your credentials using the class. basic = HTTPBasicAuth('user', 'pass')
然后你可以使用这个对象来验证一个请求:
response = requests.get('https://httpbin.org/basic-auth/user/pass', auth=basic) print(response.text)
这应该会导致一个积极的回应:
{ "authenticated": true, "user": "user" }
常见问题
NameError: 名称 ‘requests' 未定义
该错误意味着您没有正确导入 Requests 库。请确保您已经按照设置说明进行操作:使用 pip install requests 安装库,并在要运行的 Python 文件中导入它,方法是将 import requests 添加到文件的顶部。
NewConnectionError: 无法建立新连接:[Errno -5] 主机名没有关联的地址
该错误意味着您尝试访问的地址不存在。最可能的是,您尝试请求的 URL 中有拼写错误。
如何处理通过 Requests 下载的信息?
HTML 和 JSON 是您在使用 Requests 时最常遇到的两种格式。但是,当您访问 response.text 时,您将获得一个 Python 字符串。您需要将该字符串转换为 Python 特定的表示形式(解码)以高效地使用它。这可以使用 Beautiful Soup(用于 HTML)和 json(用于 JSON)库来实现。该库还包括一个内置的 JSON 解码器和编码器,您可以通过在响应上调用 .json() 方法来使用它。
结 论
在本指南中,你了解了Python Requests库的各种功能,以及JSON、HTTP方法和状态码、代理等内容。Requests是一个既简单易用又非常灵活的工具。
为了检验你的知识,你可以将该库与Beautiful Soup结合使用,进行一个网页抓取项目。你还可以在我们的博客中阅读关于使用Python进行网页抓取的详细教程。
另外,互联网上有许多免费的JSON API。你可以尝试寻找一个感兴趣的领域的API,并使用Requests从中获取信息。