🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

niquests 网络爬虫:Python 的现代 HTTP/2 请求

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

23-Jul-2026

TL;DR:

  • niquests 是 requests 的一个直接替代品,具有相同的 API 以及 HTTP/2、HTTP/3 和连接复用功能——只需更改导入,您的代码就能继续工作。
  • niquests 不支持渲染 JavaScript。 它是一个 HTTP 客户端;在脚本生成的页面上,它返回服务器发送的标记,不包含任何内容。
  • 这个差距出现在一个脚本中。 niquests 通过 HTTP/2 获取一个 JavaScript 渲染的演示页面,但在其中发现 0 个引用块。
  • niquests 还是调用 Scrapeless 的客户端。 一个实时运行使用相同的会话将 URL POST 到 Scrapeless Universal Scraping API,获取渲染后的 HTML,并从中提取所有 10 位作者。
  • 一个 HTTP 客户端处理两个任务。 直接获取有效的页面,Scrapeless API 用于需要渲染的页面——相同的 Session,相同的 API。
  • 在采集侧免费启动。app.scrapeless.com 创建您的 Scrapeless API 密钥。

niquests 是什么,以及它不是什么

niquests 是 requests 的一个分支,保留了您已经熟悉的 API——Sessiongetpostjson()——并添加了 requests 从未获得的传输功能:HTTP/2 和 HTTP/3、连接复用以及 DNS-over-HTTPS。对爬虫而言,实际的收益在于 import niquests as requests 可以在不重写的情况下将现有代码库升级到现代 HTTP,而复用的传输将许多请求通过更少的连接发送。

它并不是一个浏览器。niquests 使用 HTTP,因此它返回服务器发送的内容;它不运行构建现代页面内容的 JavaScript。更快、更现代的传输并不会改变这一点——通过 HTTP/2 获取的空页面仍然是空的。因此,niquests 爬虫这两个任务由一个客户端完成:获取直接提供内容的页面,以及调用渲染 API 来处理通过脚本构建的页面。本指南使用 Scrapeless Universal Scraping API 作为第二个任务,niquests 本身用于发起该请求。有关更广泛的工具包,请参考 Python 网络爬虫教程

安装

niquests 是整个工具链——本指南不需要单独的解析器。本指南编写时所用的版本是 niquests 3.20.1:

bash Copy
pip install "niquests==3.20.1"

将您的密钥保存在环境变量中,而不是源代码中:

bash Copy
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

直接获取及其局限性

将 niquests 指向一个 JavaScript 渲染的页面,同时有两件事情是正确的:传输是现代的,内容是缺失的。连接协商 HTTP/2——这是一个由 HTTP/2 标准 定义的协议,而 requests 无法使用——但是返回的标记中没有任何引用块,因为内容是根据 HTML 脚本规范 在客户端构建的:

python Copy
# direct.py — 现代传输,缺失内容
import niquests

session = niquests.Session()
resp = session.get("https://quotes.toscrape.com/js/", timeout=30)

print("http 版本:", resp.conn_info.http_version)
print("js 页面引用块:", resp.text.count('class="quote"'))

传输是 HTTP/2;内容却不在:

text Copy
http 版本: HttpVersion.h2
js 页面引用块: 0

这个零并不是 niquests 的失败——它是一个 HTTP 客户端在内容在脚本运行后到达的页面上所得到的正确结果。解决方案是一个渲染层的获取。

渲染获取,niquests 调用 Scrapeless

保留相同的会话并更改目标:不是页面,而是将其 URL POST 到 Scrapeless Universal Scraping API,该 API 在服务器端渲染并返回完成的 HTML。niquests 像处理其他请求一样处理这个请求,因此一个客户端覆盖了这两条路径——这里的请求和响应层遵循 HTTP 语义标准

python Copy
# rendered.py — niquests 调用渲染 API,然后提取
import os
import re

import niquests

session = niquests.Session()
resp = session.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    json={"actor": "unlocker.webunlocker", "input": {"url": "https://quotes.toscrape.com/js/", "js_render": True}},
    timeout=120,
)
resp.raise_for_status()
html = resp.json()["data"]

authors = re.findall(r'<small class="author">(.*?)</small>', html)
print("渲染的引用块:", html.count('class="quote"'))
print("提取的作者:", len(authors))
print("第一位作者:", authors[0])

现在内容存在并可提取:

text Copy
渲染的引用块: 10
提取的作者: 10

第一作者:阿尔伯特·爱因斯坦

这就是整个爬虫,它从未离开过niquests:一个Session进行直接请求而工作,一个Scrapeless请求则需要渲染。Universal Scraping API负责渲染;niquests负责HTTP。

在免费计划中获取您的API密钥:app.scrapeless.com

高级模式

  • 一行迁移。 import niquests as requests 使现有的 requests 代码库能够在没有其他更改的情况下采用HTTP/2和多路复用;API保持不变。
  • 重用会话。 单个 niquests.Session() 池化并复用连接,这就是在多个请求中显示出传输优势的地方——构建一次,传递即可。
  • 当你超越正则表达式时,添加一个真正的解析器。 这里的正则表达式使示例只需一个依赖项;对于任何超出平面列表的内容,将resp.json()["data"]传递给选择器库并选择结构化字段。
  • 让它进行协商。 当服务器提供时,niquests选择HTTP/2或HTTP/3,无法提供时干脆回退;您无需配置版本,只需在想确认时从conn_info中读取。

故障排除

  • conn_info.http_version是HTTP/1.1。 服务器没有为该请求提供HTTP/2,或者中介进行了降级。这是正常的,不是错误;niquests使用可用的最佳版本。
  • 从您在浏览器中可以看到的页面获取零个块。 内容由JavaScript渲染,直接获取返回的是预渲染的HTML——js-page quote blocks: 0的情况。通过js_render将该URL路由到Scrapeless调用。
  • Scrapeless响应中的json()引发异常。 请求在渲染之前失败。首先调用raise_for_status(),并确认密钥已设置,actor和输入格式如所示。
  • 在慢页面上的超时。 渲染比静态获取所需的时间长。为Scrapeless POST提供慷慨的timeout,正如示例所示,而不是您用于直接请求的短默认值。

结论

niquests凭借其在爬虫中所需的唯一HTTP客户端的地位赢得了认可:现代传输的requests API,同时处理直接获取和对渲染API的调用。将脚本构建的页面转化为内容的层面是获取——直接请求的零块结果确认了这一点——而由niquests本身发出的一个Scrapeless POST填补了差距。将这两条路径连接成一个会话,演示页面的十个作者通过您不需要重写的HTTP重新返回。

创建一个免费的Scrapeless帐户以获取API密钥,开发者文档涵盖unlocker.webunlocker参数。计划定期作业时,请查看Scrapeless定价

常见问题

问:niquests可以单独抓取JavaScript渲染的页面吗?

不能。niquests是一个HTTP客户端,而不是浏览器;它返回服务器发送的标记,并不运行任何脚本。在一个客户端构建内容的页面上,直接获取的内容缺失——这是指南的零块结果。通过Scrapeless Universal Scraping API将这些页面路由,该API会进行渲染,同时niquests也会发出该请求。

问:niquests与requests有什么不同?

API相同,传输更新。niquests是一个requests的分支,增加了HTTP/2、HTTP/3、连接多路复用和DNS-over-HTTPS,同时保持Sessiongetpostjson()不变。import niquests as requests通常是整个迁移过程。

问:我需要一个单独的解析器吗?

对于平面字段列表,正则表达式或标准库就足够了,如所示。对于嵌套或结构化提取,将niquests与选择器库配对——niquests负责获取,解析器负责选择。本指南故意保持一个依赖项。

问:HTTP/2是否有助于抓取阻止?

这是一种传输升级,而不是反封锁措施。HTTP/2多路复用提高了多个请求的吞吐量,但它不渲染JavaScript或消除访问挑战——这是获取层的工作,这就是为什么渲染路径通过Scrapeless。

问:使用niquests抓取是否合法?
HTTP客户端不改变集合规则。仅提取公共页面,尊重网站条款和由 机器人排除协议 标准化的机器人指令,保持数据量的限制,并根据适用的法律处理任何个人数据。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录