有状态的爬虫:为什么 Mechanize 仍然相关
Source: Dev.to

“过度”问题
如果你今天问开发者如何抓取需要登录的网站,他们几乎肯定会推荐 Playwright、Selenium 或 Ferrum。
这些工具非常强大,但它们带来了沉重的“代价”:
- Memory: 它们会启动整个 Chromium 实例。
- Speed: 它们必须下载并执行 CSS、图片和 JavaScript。
- Complexity: 你必须管理对 DOM 中元素出现的“等待”。
但是,如果你要抓取的站点不是复杂的 React 单页应用呢?如果它是一个标准的“经典”Rails、PHP 或 Django 网站,数据在服务器端渲染呢?
使用 Playwright 来做这件事就像用大锤子挂画框一样。是时候重新发现 Mechanize 了。
什么是 Mechanize?
Mechanize 是一个 Ruby 库,行为类似浏览器,但完全工作在 HTTP 层。它没有渲染引擎(没有 CSS/JS),但它 保持状态。
当你使用像 Faraday 或 Net::HTTP 这样的基本 HTTP 客户端时,每个请求都是相互独立的。你必须手动管理 cookie、headers 和重定向。Mechanize 会自动为你处理所有这些。
“Stateful” 超能力
Mechanize 比基本的 HTTP 客户端好得多的原因是它的 Cookie Jar 和 History。它记得你是谁。
示例:抓取登录门禁门户
看看 Mechanize 是多么轻松地处理登录流程。它会找到表单,填写字段,并像人类一样“提交”它。
require 'mechanize'
agent = Mechanize.new
# 1. Go to the login page
page = agent.get('https://example-portal.com/login')
# 2. Mechanize finds the form automatically
login_form = page.form_with(id: 'login-form')
# 3. Fill out the fields
login_form.username = 'my_user'
login_form.password = 'secret_pass'
# 4. Submit the form
# Mechanize follows the redirect and stores the login cookies!
dashboard = agent.submit(login_form)
# 5. Now you are logged in and can scrape the private data
puts dashboard.search('.account-balance').text
为什么你仍然应该在 2026 年使用它
-
速度(10 倍优势)
因为 Mechanize 不会下载图片、解析 CSS 或运行 JavaScript,它 极其快速。一个在 Playwright 中需要 10 秒的脚本,往往在 Mechanize 中不到 1 秒就能完成。 -
低资源占用
你可以在一台 5 美元的微型 VPS 上同时运行 100 个 Mechanize 爬虫。尝试用 100 个 Chromium 实例来做,同样的服务器会“熔化”。 -
与 Nokogiri 的原生集成
在内部,Mechanize 使用 Nokogiri 进行解析。如果你已经会使用 Nokogiri 的 CSS 或 XPath 选择器,那么你已经会使用 Mechanize 了。
何时使用 Mechanize
Mechanize 是针对以下特定场景的“恰到好处”工具:
- “经典”网页:博客、论坛、政府数据库以及传统企业门户。
- 简单自动化:需要登录并下载每月的 PDF 发票?使用 Mechanize。
- 表单提交:需要在 500 个不同的邮政编码上自动执行搜索查询?使用 Mechanize。
何时避免使用 Mechanize
Mechanize 有一个主要缺点:它无法执行 JavaScript。
如果您需要的数据只有在 Vue/React 组件挂载后才出现,或者“提交”按钮实际上是一个复杂的 JS 事件监听器,Mechanize 将返回空白页面。
摘要:合适的工具
| 特性 | HTTP Client (Faraday) | Mechanize | Headless (Playwright) |
|---|---|---|---|
| 速度 | 🐢 慢 | 🚀 最快 | 🏎️ 快 |
| Cookies/状态 | ❌ 手动 | ✅ 自动 | ✅ 自动 |
| JavaScript | ❌ 否 | ❌ 否 | ✅ 是 |
| 复杂度 | 🟢 低 | 🟢 低 | 🔴 高 |
Mechanize 是 “谦逊爬虫”。它是一个可靠、轻量级的工作马,在 Ruby 生态系统中已经存活了超过 15 年,因为它完美地解决了特定问题。在你启动 500 MB 的浏览器之前,先看看 Mechanize 能否在 20 MB 内完成任务。