Python 中的请求 – 使用 Python 请求网页

Python 中的 Requests 是一个优雅的库,可让您通过 Python 向网页发送 HTTP/1.1 请求。

Python 2.7 和 3.5+ 均正式支持它。Keep – Alive、连接池、具有持久 cookie 的会话、浏览器式 SSL 验证等高级功能使其成为开发人员的首选。

在本文中,我们将详细了解其中一些功能以及如何开始使用 Python 请求模块创建 Web 请求。

如何在Python中安装请求?

在 Python 中安装requests非常简单且直接。您可以采用多种方法在 Python 中安装模块。但在本文中,我们将向您展示如何将其与pip 模块一起使用。

打开终端或命令提示符(如果您是 Windows 用户)并输入以下命令。

pip install requests
#Or (if the first command doesn't work) use:
pip3 install requests

它应该成功在您的设备中安装请求模块。

在 Python 中使用请求

要了解请求模块的工作原理,我们需要了解浏览网页时发生的情况的基础知识,以及它如何立即向您显示您希望看到的内容。

每次您单击链接时,我们都会向请求页面的服务器发送 HTTP(超文本传输​​协议)请求。

收到请求后,服务器会向我们发送回我们请求的正确内容。我们要学习的两个最有用的 HTTP 请求是 GET 和 POST 请求。

在下一节中,我们将学习如何将这些方法与 requests 库一起使用。但首先,我们需要将其导入到您的脚本或解释器中。

import requests

1. 获取请求

此方法用于指示我们正在从服务器请求所选 URL 的内容。因此,假设我们想使用 HTTP 请求获取 google 的主页。

键入以下行。

r = requests.get("http://google.com")

下面是单行代码的作用:它通过 get() 方法向 Google 主页发送 HTTP GET 请求,其中 URL 作为参数提供。响应对象存储在我们的“r”变量中。

我们的 Response 对象的实例进一步对保留的数据进行分类并将它们存储在适当的属性中。下面是一个例子

print(r.status_code)
#The output provides the status code for the url. For a success full attempt, the result is 200
 
print(r.headers)
#The following attribute returns a python dictionary containing key-value pair of the headers
 
print(r.text)
#This command prints out the response content from the server or Static Source Code.
 
print(r.encoding)
r.encoding = 'utf-8'
#Requests library also allows you to see or change the encoding of the response content.

2.使用GET方法传递参数

通常,单个 GET 方法无法让我们找到需要访问的所有信息,因此我们需要通过原始 get 请求传递其他参数。

参数主要是包含在元组列表中的键值对数据我们可以使用 get() 方法的 params 参数发送它。

请参阅要遵循的语法。

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

输出:

{
  "args": {
    "key1": "value1",
    "key2": "value2"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.22.0",
    "X-Amzn-Trace-Id": "Root=1-5f9a64d1-2abfc74b2725386140a897e3"
  },
  "origin": 0.0.0.0,
  "url": "http://httpbin.org/get?key1=value1&key2=value2"
}

3.POST请求

与 Python 中的 GET 请求不同,HTTP 中的 POST 方法需要发布有效负载。此方法用于将数据发送到服务器,而不是直接检索数据。在我们的 requests 库中,我们可以使用 post() 方法访问 POST。

快速浏览一下语法:

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

输出:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "key1": "value1",
    "key2": "value2"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "23",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.22.0",
    "X-Amzn-Trace-Id": "Root=1-5f9a6726-276da087230912e01dd5dcd7"
  },
  "json": null,
  "origin": [REDACTED],
  "url": "https://httpbin.org/post"
}

Python中Requests的一些高级特性

我们的文章主要关注两个最基本但又非常重要的 HTTP 方法。但是 requests 模块支持多种此类方法,例如 PUT、PATCH、DELETE 等。

“请求”模块在开发人员中如此出名的关键原因之一是其高级功能,例如:

  1. Sessions 对象:它主要用于在不同请求之间存储相同的 cookie,总体上提供更快的响应。
  2. 支持 SOCKS 代理:虽然您需要安装单独的依赖项(称为“requests[socks]”),但它可以极大地帮助您处理多个请求的性能,尤其是在服务器速率限制您的 IP 的情况下。
  3. SSL 验证:您可以通过在 get() 方法中提供额外的参数“verify=True”来强制检查网站是否使用请求正确支持 SSL。如果网站未能显示对 SSL 的适当支持,脚本将抛出错误。

结论

无论是网页抓取还是其他 HTTP 相关工作,请求模块都是最受欢迎的选项。

requests 模块唯一不足的是处理页面源代码中的动态更改,因为该模块不是为执行 javascript 命令而设计的。

希望本文能让您对该模块的功能有一个基本的了解。

资源

您可以在其官方文档网站上阅读有关该模块的更多信息: https: //requests.readthedocs.io/en/latest/

他们的官方 Github 存储库:https://github.com/psf/requests