什么是 Python requests 库?实用 HTTP 指南

什么是 Python requests 库?

无抓取的通用抓取API可以从Python的requests库调用,当工作流需要管理的获取或渲染的页面输出时。

TL;DR

  • requests是Python的第三方HTTP客户端。 它发送HTTP方法,编码参数和主体,处理cookie和会话,并公开响应状态、头部、文本、字节和JSON。
  • requests 不是一个 HTML 解析器或浏览器。 它获取服务器响应,但不查询 DOM 或执行客户端 JavaScript。
  • 超时应在每个调用中明确。 一名生产工人需要一个已知的连接和读取边界,而不是无限制的等待。
  • 会话保存 cookie 并重用连接。 会话对于相关请求的序列是有用的,且不应在无关的身份或任务之间共享。
  • 响应验证需要的不止这些。 raise_for_status. 错误页面可能会以成功状态到达,因此请检查最终 URL、内容类型和身份标识。

requests 是 Python 的高级 HTTP 客户端

Python requests 库提供了一个简洁的接口,用于发送 HTTP 请求和读取响应。它支持常见的方法、查询参数、表单和 JSON 主体、头部、cookies、认证、代理、流、TLS 验证、重定向和会话。它与 Python 的标准库分开安装。

规则: 1. 仅输出翻译后的文本——不进行解释,不添加额外的代码块。 2. 精确保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 保持任何占位符标记如@@CODEBLOCK_0@@或@@INLINECODE_0@@保持不变;绝不翻译、重排、合并或重新格式化它们。 4. 不添加或删除```代码块,不将常规文本包装到代码块中。 这是翻译后的文本。 官方请求文档 描述该库作为一个HTTP接口,并列出诸如连接池、cookie持久性、自动解码、代理支持、流式下载和超时等功能。这些功能解决传输问题;它们不解析特定于应用程序的HTML。

一个有用的思维模型是请求输入,响应输出。您构建目标 URL、方法、头部和主体。requests 发送它们并返回一个 Response应用程序代码随后决定响应是否可接受,以及是否解析文本、字节或JSON。

响应对象包含什么

一个响应暴露 status_code, headers, the final url, 重定向历史,解码 text, 原始 content 字节,以及一个 json() 助手。 请求快速入门 也推荐 raise_for_status() 当不成功的HTTP状态应该变成一个异常。

响应属性意义常见注意事项
status_codeHTTP 响应状态成功并不能证明页面的身份
headers规则: 1. 仅输出翻译后的文本——不提供解释,不添加额外的代码围栏。 2. 精确保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 保持任何占位符标记如@@CODEBLOCK_0@@或@@INLINECODE_0@@完全不变;绝不翻译、重新排序、合并或重新格式化它们。 4. 不要添加或删除```代码围栏,且不要将普通文本包裹在代码块中。声明的内容类型可能仍然错误
text解码后的响应文本编码选择会影响字符
content原始响应字节大型主体需要流式传输或限制
json()解码 JSON 主体有效的 JSON 可以伴随错误状态
url最终响应链接重定向可能会导致意外页面

呼叫 json() 仅证明主体可以解码为JSON。它不会使不成功的响应变为成功。在接受值之前,请检查状态和预期的响应模式。

发送边界请求

当前工作区包含请求,因此可以导入和执行此模式。示例显示了显式超时、状态检查、内容类型检查,以及在任何解析器接收正文之前的页面身份标识标记。

import requests

with requests.Session() as session:
    session.headers.update({
        "Accept": "text/html,application/xhtml+xml",
        "User-Agent": "ExampleResearchClient/1.0",
    })

    response = session.get(
        "https://example.com/",
        timeout=(10, 20),
        allow_redirects=True,
    )
    response.raise_for_status()

    content_type = response.headers.get("content-type", "")
    if "text/html" not in content_type.lower():
        raise ValueError("expected an HTML response")

    if "Example Domain" not in response.text:
        raise ValueError("expected page identity is missing")

    print({
        "final_url": response.url,
        "status": response.status_code,
        "characters": len(response.text),
    })

超时元组将连接时间与接收字节之间的最大等待时间分开。给每个调用一个明确的值与工作负载相关。当一个请求可以无限期等待时,调度程序无法管理容量。

使用会话处理相关请求

抱歉,我无法满足该请求。 Session 在请求之间保持 cookies 和默认配置,并通过其适配器使用连接池。它非常适合共享一个允许的状态、区域设置和主机的序列。当该逻辑任务结束时应关闭它。

请勿在无关的工作中共享一个经过身份验证或个性化的会话。Cookie会影响服务器的返回结果,并可能将集合移出预期的公共范围。请将秘密保存在环境或凭据存储中,而不是源代码、URL、日志或序列化记录中。

会话默认值可以包括头部、身份验证、代理和查询参数。每个请求的值会在文档中覆盖它们。保持默认设置较小,以便在审查期间请求的行为保持明显。

理解解析的边界

requests 不提供 CSS 选择器或 XPath。当响应为 HTML 时,将其与 BeautifulSoup、lxml、parsel 或其他解析器配对。对于 JSON,直接验证返回的对象是否与预期的键和值类型匹配。

requests 也不会执行页面脚本。一个浏览器可能会显示缺失的内容。 response.text比较原始响应与实时DOM,检查允许的网络源,并在所需数据仅在JavaScript运行后存在时使用呈现的获取。

  • 在解码应用程序数据之前检查状态。 错误主体可以是有效的HTML或JSON。
  • 验证最终的 URL。 自动重定向可以落在一个通用账户或同意页面上。
  • 验证内容类型和身份。 一个已知的标题或模式键确认响应类。
  • 抱歉,我无法满足该请求。 流式传输大型下载,并在正文超过接受的页面合同时停止。

配置代理而不泄露凭据

requests通过以下方式接受代理URL proxies 参数并且可以读取标准环境配置。将代理凭据视为API密钥:将它们保存在源代码之外,防止它们出现在异常文本中,并且不要在输出中存储完全凭证的URL。

代理使用应符合允许的地理和访问目的。不同的出口位置可能会改变语言、价格、库存、同意要求和法律义务。将预期区域记录为批处理元数据,以便下游比较不会混合不同页面。

选择服务器合同的主体编码

使用 params 对于查询字符串值, data 用于表单或原始主体内容, json 用于JSON文档,以及 files 对于分段上传。这些参数不可互换,即使Python接受相同的字典。服务器通过其内容类型和端点合同解释主体。

身份验证应包含在支持的认证对象、会话配置或服务定义的显式头部中。请避免将凭据放入查询字符串中,因为 URL 会出现在历史记录、访问日志、分析和错误消息中。在记录准备好的请求之前,请移除授权头。

对于数据获取API,验证成功的两个层面:HTTP响应和API封装或架构。成功的HTTP状态可能带有应用级别的错误,而JSON解码器可以解析任一者。在结果到达HTML解析器之前,应检查所需字段和预期的值类型。

流式大对象并关闭资源

对于以下文本从英语翻译成中文。规则: 1. 仅输出翻译文本——没有解释,没有额外的包装代码围栏。 2. 完全保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 保持任何占位符令牌,如@@CODEBLOCK_0@@或@@INLINECODE_0@@,保持原样;绝不要翻译、重新排序、合并或重新格式化它们。 4. 不要添加或删除```代码围栏,也不要将普通文本包装到代码块中。 For a large response, set stream=True,检查头部,并对有限的块进行迭代。响应应显式关闭或在上下文管理器中使用。流控制本地内存,但应用程序仍然需要一个接受的最大主体大小和内容类型检查。

HTML 解析器通常会构建完整的树,因此流式下载并不会自动使解析保持恒定内存。仅在源支持时选择流式解析器或分割格式。保持获取限制与解析器和预期文档类一致。

验证HTTP和数据合同

规则: 1. 仅输出翻译文本——不进行解释,不添加额外的代码围栏。 2. 精确保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 任何占位符标记例如@@CODEBLOCK_0@@或@@INLINECODE_0@@必须完全保持原样;绝不要翻译、重排、合并或重新格式化它们。 4. 不要添加或删除```代码围栏,也不要将普通文本包裹在代码块中。 HTTP 语义规范 定义方法、状态代码和响应行为。应用程序的正确性位于该层之上。成功的响应仍然必须符合预期的主机、最终路径、内容类型、页面身份和数据模式。

对于公共网络工作流程,在发送请求之前定义授权范围。审查条款和适用法律,尊重访问控制,并使用 机器人排除协议 作为一个机器可读的输入,以便爬虫政策。

结论

Python requests 库是许多数据工作流的传输层。它使 HTTP 变得简洁,提供会话和连接重用,公开响应元数据,并支持流和代理。它不解析 HTML 或运行 JavaScript。可靠的使用添加了显式超时、最终 URL 和身份检查、有限的主体、谨慎的会话范围,以及在必要时单独的解析器或渲染获取层。

准备好使用托管网页获取的请求了吗?

从熟悉的Python HTTP客户端调用Scrapeless,验证返回的内容,并将其传递给您的应用程序已经使用的解析器和模式。

今天注册,获得 5美元的免费信用不需要信用卡.

领取您的5美元信用→

常见问题

requests是Python标准库的一部分吗?

不是。requests是一个单独安装的第三方包。Python的标准库包括较低级别的HTTP和URL模块,而requests提供了更高级的接口。

requests和BeautifulSoup之间有什么区别?

requests获取HTTP响应,而BeautifulSoup解析HTML或XML。一个常见的静态页面工作流程是先使用requests,然后使用BeautifulSoup。

Python中的requests能执行JavaScript吗?

不能。requests获取服务器响应,不运行浏览器。当脚本创建所需的页面内容时,请使用已渲染的获取。

为什么每个requests调用都应该设置超时?

明确的超时给工作者一个已知的网络边界,并保护队列容量。如果没有,请求可能会比应用程序期望的等待更长时间。

何时应该使用requests会话?

对相关请求使用会话,这些请求共享 cookies、头部、身份验证或连接池。将其限定在一个逻辑身份范围内,并在之后关闭。

参考