使用 NODRIVER 进行网络抓取

2025 年使用 NODRIVER 进行网络抓取

在本指南中,我将向您介绍 NODRIVER 是什么,为什么它与众不同,以及如何使用它来构建网络刮擦程序--即使你是编码或刮擦程序的新手。

什么是 NODRIVER?

NODRIVER 是一款基于 Python 的浏览器自动化工具。它允许你打开网站、与网站互动并收集数据,所有这些都通过代码实现。

与许多刮擦工具不同,NODRIVER 不依赖 Selenium 或 Puppeteer。它不使用 ChromeDriver 也不是。相反,它使用自己的方法来控制浏览器。这给它带来了一些优势:

  • 与传统工具相比,它能更好地避免检测。
  • 它的设置要求较少。
  • 它支持现代异步编程。

使用 MCP 服务器改进您的搜索功能

如果您需要一个简单、经济的解决方案来进行大规模或复杂的网络刮擦,包括使用验证码或高级反僵尸保护的网站,那么您应该考虑以下方案 Bright Data 的模型上下文协议 (MCP).

我与 Bright Data 没有任何关系,我只是非常喜欢使用 MCP 服务器。他们的 MCP 服务器可以让您从一个地方访问他们的所有产品。检查 所有可用工具.

现在,让我们回到 NODRIVER!

为什么使用 NODRIVER 进行网络抓取?

许多工具,如 Selenium、Playwright 和 Puppeteer 已经存在。那么,为什么要考虑 NODRIVER 呢?

这里有几个原因:

1.无外部驱动程序

像 Selenium 这样的传统工具需要使用 ChromeDriver,而 ChromeDriver 的安装和更新都很麻烦。NODRIVER 则不需要。你只需要 Python 和一个 基于 Chrome 浏览器 (如 Chrome 或 Brave)。

2.简单设置

只需一条命令就能安装 NODRIVER:

pip install nodriver

无需其他设置。你无需处理复杂的路径或系统变量。

3.异步设计

大多数刮库都是同步的。这意味着它们一次运行一个任务。NODRIVER 使用异步函数,能让你在更短的时间内完成更多任务,非常适合同时搜索多个页面。

4.更善于避免被发现

网站在检测机器人方面越来越聪明。由于 NODRIVER 并不遵循 Selenium 或 Puppeteer 的模式,因此在某些情况下可以避免被检测到。

设置第一个 NODRIVER 脚本

让我们来看看使用 NODRIVER 抓取一个简单网站的步骤。

步骤 1:安装 NODRIVER

打开终端并运行

pip install nodriver

确保同时安装了 Python 3.7。

步骤 2:编写基本脚本

下面是 NODRIVER 脚本的基本骨架:

import 节点驱动程序
async def main():
浏览器 = await nodriver.start()
页面 = await browser.get("https://example.com")
await page.close()
if __name__ == '__main__'(__main__:
nodriver.loop().run_until_complete(main())

该脚本会打开浏览器,访问网站,然后关闭。

浏览页面和收集数据

现在,让我们深入了解如何收集真实数据。

示例:从网站抓取报价

比方说,您想从一个网站收集报价,如 https://quotes.toscrape.com. 这个网站是用来练习刮擦的。

下面介绍如何在一页上收集所有报价:

import 节点驱动程序
async def main():
浏览器 = await nodriver.start()
页面 = await browser.get("https://quotes.toscrape.com")
引号 = await page.select_all("div.quote")
for quote in 引号:
文本 = (await quote.query_selector("span.text")).text
作者 = (await quote.query_selector("小作者").文本
print(f"{文本} - {作者}")
await page.close()
if __name__ == '__main__'(__main__:
nodriver.loop().run_until_complete(main())

处理多个页面

许多网站会将数据分割成多个页面。这就是所谓的分页。

为此,您需要检测 "下一步 "按钮,并不断访问新页面,直到它消失为止。

方法如下

import 节点驱动程序
async def main():
浏览器 = await nodriver.start()
base_url = "https://quotes.toscrape.com"
next_url = "/"
while next_url:
page = await browser.get(base_url next_url)
引语 = await page.select_all("div.quote")
for quote in 引号:
文本 = (await quote.query_selector("span.text")).text
作者 = (await quote.query_selector("小作者").文本
print(f"{文本} - {作者}")
next_btn = await page.select("li.next > a")
if next_btn:
attrs = next_btn.attributes
for i in range(len(attrs)):
if attrs[i] == "href":
next_url = attrs[i 1]
break
else:
next_url = None
await page.close()
if __name__ == '__main__'(__main__:
nodriver.loop().run_until_complete(main())

该版本会浏览所有页面,并打印找到的每一句话。

提取和存储数据

您可以将数据保存在文件中,而不是打印出来。JSON 就是一种很好的格式。

下面介绍如何在 JSON 文件中存储刮取的报价:

import 节点驱动程序
import json
async def main():
浏览器 = await nodriver.start()
base_url = "https://quotes.toscrape.com"
next_url = "/"
data = []
while next_url:
page = await browser.get(base_url next_url)
引语 = await page.select_all("div.quote")
for quote in 引号:
文本 = (await quote.query_selector("span.text")).text
作者 = (await quote.query_selector("小作者")).text
标签 = [tag.text for 标签 in await quote.query_selector_all("a.tag")]
data.append({
"引用":文本、
"作者": author、
"标签"标签
})
next_btn = await page.select("li.next > a")
if next_btn:
attrs = next_btn.attributes
for i in range(len(attrs)):
if attrs[i] == "href":
next_url = attrs[i 1]
break
else:
next_url = None
await page.close()
with open("quotes.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False,缩进=4)
if __name__ == '__main__'(__main__:
nodriver.loop().run_until_complete(main())

运行后,你将得到一个包含所有搜刮内容的 quotes.json 文件。

NODRIVER 目前面临的挑战

尽管 NODRIVER 功能强大,但它仍然是一款新产品。这意味着还存在一些错误和功能缺失。

1.无头模式可能不起作用

在不显示浏览器的情况下运行 NODRIVER(无头模式)有时会失败。这可能是一个错误,也可能是避免僵尸检测的一个功能。

2.属性提取不顺畅

当您尝试获取元素的属性时,NODRIVER 返回的是一个列表而不是字典。这就增加了工作难度。例如

attrs = element.attributes

# ['href','/page/2/']。

您必须循环浏览这份清单,才能找到所需的内容。

3.有限的代理支持

使用代理对严肃的刮擦很重要。NODRIVER 有一个 create_context() 方法,但没有足够的文档。该方法将来也许能用,但现在只能说是 "中看不中用"。

NODRIVER 的良好使用案例

NODRIVER 适用于

  • 学习异步刮擦
  • 避免简单的僵尸检测
  • 搜索小型网站
  • 快速测试创意

如果您正在开发一个复杂的项目,需要使用登录流、验证码或 IP 禁止,那么您现在可能仍然需要 Selenium 或 Playwright。

NODRIVER 的替代品

如果 NODRIVER 无法满足您的需求,这里有一些可靠的工具可供参考:

Playwright

  • 完全异步
  • 支持无头模式
  • 内置对等待、身份验证和文件下载的支持

Selenium

  • 非常成熟
  • 支持多种浏览器
  • 大型社区和大量教程

Scrapy

  • 最适合大规模刮削
  • 使用选择器和管道
  • 用于抓取多个页面并存储数据

NODRIVER 的未来

NODRIVER 仍在不断发展壮大。它背后的开发者同时也是 "未检测 Chromedriver "的创造者,后者曾因躲避僵尸检测而大受欢迎。这一背景让我们相信,随着时间的推移,NODRIVER 将变得更加稳定。

我们期待很快看到的功能:

  • 更好的属性处理
  • 完全支持代理服务器
  • 改进页面交互,如点击和打字
  • 无头工作模式

结论

有了 NODRIVER 这样的工具,2025 年的网络搜索变得更快、更简单。它让你只需很少的设置就能构建简单快速的刮擦工具。NODRIVER 重量轻,易于使用。它无需使用 Selenium 或 Puppeteer 即可运行。这使得它非常适合小型项目或学习异步刮擦。

不过,它仍然存在一些缺陷。它还不完全支持代理、验证码或无头模式。对于更高级的需求,Playwright 或 Selenium 等工具是更好的选择。但如果你想快速测试想法,NODRIVER 是一个不错的选择。它是当今最有趣的刮擦工具之一。

类似文章