本页内容
一名使用 requests 和 BeautifulSoup 的 Python 开发者,能用不到 50 行代码抓取大多数网站。这种方案从 2012 年起就一直好用。但在 2026 年,AI 智能体正在改写抓取的玩法——而 Model Context Protocol 正处在这场变革的中心。问题已不再是「Python 能抓这个吗?」,而是「到底还该不该由人来写抓取代码?」。
本指南将传统的 Python 网页抓取与基于 MCP 的抓取并排对比:相同任务、不同方案、坦诚的取舍。
目录
- 两种方案速览
- 任务 1:从 URL 提取文章正文
- 任务 2:用 CSS 选择器抓取结构化数据
- 任务 3:爬取多个页面并汇总结果
- 任务 4:处理 JavaScript 渲染的内容
- 性能与成本对比
- 何时使用 Python 抓取
- 何时使用基于 MCP 的抓取
- 你能把两者结合吗?
- 常见问题
两种方案速览
| 方面 | Python 抓取 | MCP 抓取(CrawlForge) |
|---|---|---|
| 配置时间 | 10-30 分钟(安装库、写代码) | 2 分钟(安装服务器、连接 AI) |
| 所需代码 | 每个抓取器 20-200+ 行 | 0 行(AI 选择工具) |
| 维护 | 手动(选择器会失效) | 自动(AI 适应变化) |
| 反爬处理 | 手动(代理、请求头、重试) | 内置(隐身模式) |
| 输出格式 | 原始 HTML,手动解析 | 干净文本、JSON、markdown |
| AI 集成 | 单独步骤(把数据喂给 LLM) | 原生(LLM 驱动抓取) |
| 成本 | 免费(你的算力) | 基于 credits(每个工具 1-10 credits) |
| 最适合 | 自定义流水线、完全掌控 | AI 工作流、快速原型 |
任务 1:从 URL 提取文章正文
目标: 从一篇新闻文章获取干净、可读的文本。
Python 方案
// Python equivalent in TypeScript for comparison
// Using node-fetch + cheerio (mirrors requests + BeautifulSoup pattern)
import * as cheerio from 'cheerio';
async function extractArticle(url: string): Promise<string> {
const response = await fetch(url);
const html = await response.text();
const $ = cheerio.load(html);
// Remove scripts, styles, nav, footer
$('script, style, nav, footer, header, aside').remove();
// Try common article selectors
const selectors = ['article', '.post-content', '.article-body', 'main'];
for (const selector of selectors) {
const text = $(selector).text().trim();
if (text.length > 200) return text;
}
// Fallback to body
return $('body').text().trim();
}
const text = await extractArticle('https://techcrunch.com/2026/04/01/ai-agents');
console.log(text); // Often includes nav text, ads, related articles代码行数: 18 问题: 靠猜选择器、广告/导航文本混入、没有可读性评分。
MCP 方案
// With CrawlForge MCP -- Claude handles this automatically when you say:
// "Extract the main article text from this TechCrunch post"
// Behind the scenes, Claude calls extract_content:
const result = await crawlforge.extract_content({
url: 'https://techcrunch.com/2026/04/01/ai-agents'
});
console.log(result.content); // Clean article text, no nav/ads/boilerplate代码行数: 0(自然语言提示)或 4(直接调用 API)
结果: CrawlForge 的 extract_content 工具使用可读性算法来隔离主要内容,自动剥离导航、广告和样板文本。
任务 2:用 CSS 选择器抓取结构化数据
目标: 从一个电商页面提取产品名称和价格。
Python 方案
// Python-style scraping with cheerio
import * as cheerio from 'cheerio';
interface Product {
name: string;
price: string;
rating: string;
}
async function scrapeProducts(url: string): Promise<Product[]> {
const response = await fetch(url, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
});
const html = await response.text();
const $ = cheerio.load(html);
const products: Product[] = [];
$('.product-card').each((_, element) => {
products.push({
name: $(element).find('.product-title').text().trim(),
price: $(element).find('.price').text().trim(),
rating: $(element).find('.rating').attr('data-score') || 'N/A'
});
});
return products;
}代码行数: 22 问题: 硬编码的选择器在网站改版时会失效。伪造 User-Agent 很脆弱。没有重试逻辑。
MCP 方案
// CrawlForge scrape_structured with CSS selectors
const products = await crawlforge.scrape_structured({
url: 'https://store.example.com/products',
selectors: {
name: '.product-card .product-title',
price: '.product-card .price',
rating: '.product-card .rating'
}
});
console.log(products);
// [{ name: "Widget Pro", price: "$29.99", rating: "4.5" }, ...]代码行数: 8 优势: CrawlForge 负责 User-Agent 轮换、重试,并返回干净的 JSON。如果选择器需要更新,AI 可以检查页面并建议新的选择器。
任务 3:爬取多个页面并汇总结果
目标: 抓取一个文档站点搜索结果的前 5 页。
Python 方案
// Multi-page crawl with manual pagination
import * as cheerio from 'cheerio';
interface SearchResult {
title: string;
url: string;
snippet: string;
}
async function crawlDocs(baseUrl: string, pages: number): Promise<SearchResult[]> {
const results: SearchResult[] = [];
for (let page = 1; page <= pages; page++) {
const url = `${baseUrl}?page=${page}`;
const response = await fetch(url);
const html = await response.text();
const $ = cheerio.load(html);
$('.search-result').each((_, el) => {
results.push({
title: $(el).find('h3 a').text().trim(),
url: $(el).find('h3 a').attr('href') || '',
snippet: $(el).find('.snippet').text().trim()
});
});
// Respectful delay between requests
await new Promise(resolve => setTimeout(resolve, 1000));
}
return results;
}
// 5 pages * 1 second delay = minimum 5 seconds
const results = await crawlDocs('https://docs.example.com/search?q=auth', 5);代码行数: 28 问题: 手写分页逻辑、硬编码延迟、没有并行执行、对失败页面没有错误处理。
MCP 方案
// CrawlForge crawl_deep handles pagination and parallel fetching
const results = await crawlforge.crawl_deep({
url: 'https://docs.example.com/search?q=auth',
max_depth: 2,
max_pages: 50,
include_patterns: ['/docs/'],
extract_content: true,
concurrency: 5 // 5 parallel requests
});
console.log(results.pages.length); // Up to 50 pages crawled
console.log(results.pages[0].content); // Clean extracted content per page代码行数: 8 优势: 内置并发、深度控制、URL 过滤和内容提取。CrawlForge 在内部管理请求时序和重试。
任务 4:处理 JavaScript 渲染的内容
目标: 抓取一个通过客户端 JavaScript 加载产品数据的 React SPA。
Python 方案
// Requires Playwright or Puppeteer for JS rendering
import { chromium } from 'playwright';
async function scrapeSPA(url: string) {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle' });
// Wait for dynamic content to render
await page.waitForSelector('.product-grid', { timeout: 10000 });
const products = await page.evaluate(() => {
return Array.from(document.querySelectorAll('.product-card')).map(card => ({
name: card.querySelector('.name')?.textContent?.trim() || '',
price: card.querySelector('.price')?.textContent?.trim() || ''
}));
});
await browser.close();
return products;
}代码行数: 20 问题: 需要浏览器二进制文件(~400MB)、内存占用高、执行更慢、手写等待逻辑。
MCP 方案
// CrawlForge scrape_with_actions handles JS rendering + interaction
const result = await crawlforge.scrape_with_actions({
url: 'https://react-store.example.com/products',
actions: [
{ type: 'wait', selector: '.product-grid', timeout: 10000 },
{ type: 'scroll', selector: 'body' } // Trigger lazy loading
],
extractionOptions: {
selectors: {
name: '.product-card .name',
price: '.product-card .price'
}
}
});代码行数: 11 优势: 无需本地浏览器二进制文件。CrawlForge 在其基础设施上运行浏览器。操作是声明式的,而非命令式的。
性能与成本对比
| 指标 | Python(自建) | MCP(CrawlForge) |
|---|---|---|
| 配置时间 | 30-60 分钟 | 2-5 分钟 |
| 首个结果耗时 | 5-15 分钟(编写 + 调试) | 30 秒(自然语言) |
| 每个抓取器的代码行数 | 20-200 | 0-15 |
| 维护负担 | 高(选择器会失效) | 低(AI 自适应) |
| 基础设施成本 | 你的服务器 + 代理 | $0-$99/月(基于 credits) |
| 反爬处理 | 手动实现 | 内置隐身模式 |
| 并行执行 | 手写异步代码 | 内置并发 |
| AI 集成 | 单独的流水线步骤 | 原生(LLM 即编排者) |
何时使用 Python 抓取
在以下情况下,Python 抓取是更好的选择:
- 你需要完全掌控流水线 —— 自定义 ETL、特定的数据转换、与 pandas/numpy 集成
- 你在超大规模抓取 —— 数百万页面,credits 成本会高得难以承受(在那种体量下,Scrapy 集群的单页成本可能更低)
- 你已有现成的基础设施 —— 已经搭好的代理池、请求队列、监控面板
- 目标稳定 —— 内部工具、API,或结构众所周知、很少变动的页面
- 你需要离线执行 —— 物理隔离的环境或没有互联网访问的边缘部署
何时使用基于 MCP 的抓取
在以下情况下,使用 CrawlForge 的基于 MCP 的抓取是更好的选择:
- 你在构建 AI 应用 —— RAG 流水线、研究智能体、内容分析系统
- 出结果的速度很重要 —— 原型开发、一次性研究、竞争分析
- 你不想维护抓取器 —— 由 AI 处理选择器变化和网站改版
- 需要绕过反爬 —— CrawlForge 的隐身模式负责规避检测
- 你想要零基础设施 —— 没有服务器、代理或浏览器二进制文件需要管理
- 需要多种输出格式 —— 从同一来源得到文本、JSON、markdown
你能把两者结合吗?
可以。许多团队用 Python 处理核心数据流水线,用 CrawlForge 作为提取层。做法如下:
// Use CrawlForge for extraction, Python/TypeScript for pipeline logic
import { CrawlForge } from '@crawlforge/sdk';
const cf = new CrawlForge({ apiKey: process.env.CRAWLFORGE_API_KEY });
// Step 1: Use CrawlForge to extract clean content
const extracted = await cf.extractContent({
url: 'https://competitor.com/pricing'
});
// Step 2: Process with your own pipeline
const pricing = parsePricingMarkdown(extracted.content);
await database.upsert('competitor_pricing', pricing);
await notifySlack(`Updated pricing data: ${pricing.plans.length} plans found`);这种混合方案让你既享有 CrawlForge 的提取质量和反爬功能,又能把流水线逻辑保留在自己的代码库中。
常见问题
MCP 抓取比 Python 抓取更快吗?
首个结果耗时上,MCP 要快得多。用 CrawlForge 向 Claude 发出一条自然语言请求,几秒内就能返回结果,而编写和调试 Python 代码要花 10-30 分钟。原始执行速度则相当——两者都向目标站点发出 HTTP 请求。差别在于开发者时间,而不是网络时间。
MCP 能完全取代 Python 做网页抓取吗?
不能。Python 抓取让你完全掌控流水线的每个环节——请求调度、自定义解析逻辑、数据转换,以及与科学计算库的集成。MCP 最适合 AI 驱动的工作流、原型开发,以及你想让 LLM 来编排抓取的场景。许多团队两者都用。
相比免费的 Python 库,MCP 抓取要花多少钱?
CrawlForge 的免费额度包含 1,000 个一次性 credits 供起步。像 fetch_url 这样的简单操作花 1 credit,像 deep_research 这样的高级操作花 10。$19/月的 Hobby 套餐提供 5,000 credits,足以覆盖轻量级生产负载。Python 库是免费的,但你要为代理服务、计算基础设施以及维护抓取器的开发者时间付费。
CrawlForge 能抓取那些屏蔽 Python 请求的站点吗?
可以。CrawlForge 的隐身模式使用指纹随机化、住宅代理和模拟人类行为来绕过反爬检测。使用 requests 或 httpx 的传统 Python 抓取,很容易被 Cloudflare Turnstile、DataDome 和 PerimeterX 等现代反爬系统识别。
试试基于 MCP 的抓取,感受不同。 免费开始,赠 1,000 credits——把 CrawlForge 连接到 Claude,不到一分钟就能运行你的第一次抓取。
亲自试一试——无需注册
在 Playground 中运行 CrawlForge 的 27 个抓取与提取工具中的任意一个,然后免费开始,获取 1,000 credits。
1,000 免费 credits • 每月补充 • 无需信用卡
标签
及时获取最新洞察
将教程、产品更新与 Web 抓取技巧直接发送到你的收件箱。
拒绝垃圾邮件,随时可取消订阅。