Web抓取MCP服务器
一款功能强大的开源web抓取模型上下文协议(MCP)服务器,无需API密钥即可像Firecrawl-but一样工作!使用Python和现代网络抓取库构建。
特性
- 🔍 智能刮擦:通过自动格式检测从任何网页中提取内容
- 📄 多种格式:获取Markdown、HTML、纯文本或结构化JSON格式的内容
- 🕷️ 网站爬行:递归抓取具有深度和页面限制的网站
- 🔗 链接提取:快速发现页面上的所有链接
- ⚡ JavaScript支持:使用Playwright渲染动态页面
- 📸 截图:捕获整页或视口屏幕截图
- 🚀 批处理:同时删除多个URL
- 🎯 没有API密钥:完全免费和开源
工具
1. webscrape_scrape_url
从单个URL中抓取内容。
最适合:
- 提取文章内容
- 将网页转换为markdown
- 获取页面元数据
- 删除静态网站
参数:
url(string,必填):要抓取的网页URLresponse_format(枚举,默认:“markdown”):输出格式(markdown、html、text、json)include_links(boolean,默认值:false):从页面中提取所有链接include_images(布尔值,默认值:false):提取图像URLinclude_metadata(布尔值,默认值:true):包含页面元数据
例子:
{
"url": "https://example.com/article",
"response_format": "markdown",
"include_links": true
}2. webscrape_scrape_multiple_urls
同时删除多个URL(最多20个)。
最适合:
- 批量处理文章URL
- 从站点地图中抓取多个页面
- 跨页面比较内容
参数:
urls(数组,必填):要抓取的1-20个URL列表response_format(枚举,默认值:“markdown”):输出格式include_metadata(布尔值,默认值:true):包含页面元数据
例子:
{
"urls": [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
],
"response_format": "json"
}3. webscrape_crawl_site
递归地抓取链接后的网站。
最适合:
- 发现一个部分中的所有页面
- 报废文件网站
- 构建网站地图
- 内容审核
参数:
url(字符串,必填):要爬网的起始URLmax_depth(整数,默认值:2):最大链接深度(0-5)max_pages(整数,默认值:20):要爬网的最大页面数(1-100)same_domain_only(布尔值,默认值:true):仅抓取同一域response_format(枚举,默认值:“markdown”):输出格式
例子:
{
"url": "https://docs.example.com",
"max_depth": 3,
"max_pages": 50,
"same_domain_only": true
}4. webscrape_extract_links
从网页中提取所有链接。
最适合:
- 现场测绘
- 查找所有子页面
- 链接分析
- 导航发现
参数:
url(字符串,必填):从中提取链接的URLsame_domain_only(boolean,默认值:false):仅返回来自同一域的链接include_anchors(boolean,默认值:false):包含片段链接(#部分)
例子:
{
"url": "https://example.com",
"same_domain_only": true,
"include_anchors": false
}5. webscrape_scrape_with_js
使用Playwright抓取JavaScript渲染的页面。
最适合:
- 单页应用程序(React、Vue、Angular)
- 延迟加载内容的页面
- JavaScript密集型网站
- 动态仪表板
参数:
url(字符串,必填):用JS渲染抓取的URLwait_for_selector(string,可选):要等待的CSS选择器wait_seconds(整数,默认值:2):额外等待时间(0-30秒)response_format(枚举,默认值:“markdown”):输出格式
例子:
{
"url": "https://app.example.com/dashboard",
"wait_for_selector": ".data-loaded",
"wait_seconds": 3,
"response_format": "markdown"
}6. webscrape_screenshot_url
捕获网页的屏幕截图。
最适合:
- 可视化文档
- 页面外观验证
- 存档页面布局
- 创建缩略图
参数:
url(字符串,必填):截图URLfull_page(布尔值,默认值:true):捕获整个页面或视口width(整数,默认值:1920):视口宽度(像素)(320-3840)height(整数,默认值:1080):视口高度(像素)(240-2160)
例子:
{
"url": "https://example.com",
"full_page": true,
"width": 1920,
"height": 1080
}安装
先决条件
- Python 3.10或更高版本
- pip或uv包管理器
第一步:克隆或下载
# Create a directory for your MCP server
mkdir webscrape-mcp
cd webscrape-mcp
# Copy the server file and requirements步骤2:安装依赖项
使用pip:
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt使用紫外线:
# Install dependencies
uv pip install -r requirements.txt步骤3:安装Playwright(可选但推荐)
对于JavaScript渲染和屏幕截图功能:
# Install Playwright browsers
playwright install chromium这将安装所需的Chromium浏览器 webscrape_scrape_with_js 和 webscrape_screenshot_url 工具。
配置
克劳德桌面
添加到您的Claude Desktop配置文件中:
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"webscrape": {
"command": "python",
"args": ["/absolute/path/to/webscrape_mcp.py"]
}
}
}或者使用紫外线:
{
"mcpServers": {
"webscrape": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/webscrape-mcp", "python", "webscrape_mcp.py"]
}
}
}其他MCP客户端
对于其他兼容MCP的客户端(游标、VS代码等),请参阅其文档,了解如何通过stdio传输添加MCP服务器。
用法示例
示例1:删除博客文章
User: "Scrape this article and convert it to markdown: https://example.com/blog/post"
Claude uses: webscrape_scrape_url
{
"url": "https://example.com/blog/post",
"response_format": "markdown",
"include_metadata": true
}
Returns: Clean markdown with title, content, and metadata示例2:查找所有文档页面
User: "Find all pages in the docs section: https://docs.example.com"
Claude uses: webscrape_crawl_site
{
"url": "https://docs.example.com",
"max_depth": 2,
"max_pages": 50,
"same_domain_only": true
}
Returns: List of all discovered pages with their content示例3:报废动态内容
User: "Scrape this React app page: https://app.example.com/data"
Claude uses: webscrape_scrape_with_js
{
"url": "https://app.example.com/data",
"wait_for_selector": ".data-table",
"wait_seconds": 3
}
Returns: Fully rendered page content after JavaScript execution示例4:提取所有链接
User: "Get all internal links from this page: https://example.com"
Claude uses: webscrape_extract_links
{
"url": "https://example.com",
"same_domain_only": true,
"include_anchors": false
}
Returns: JSON with categorized internal/external links详细功能
内容提取
服务器智能地从网页中提取内容:
- 标记语言:简洁易读的格式非常适合LLM
- 超文本标记语言:用于详细分析的原始HTML
- 文本:纯文本,无格式
- JSON:带元数据的结构化数据
元数据抽取
自动提取:
- 页面标题
- 元描述
- 关键词
- 作者信息
- 打开图形数据(og:标题、og:描述等)
分页支持
所有基于列表的工具都支持分页:
- 可配置的页面限制
- 基于偏移量的分页
- 总计数报告
错误处理
强大的错误处理功能:
- 网络超时
- URL无效
- HTTP错误(404、403、429等)
- JavaScript渲染失败
- 警告内容太大
字符限制
响应限制为25000个字符,以防止出现压倒性的结果。当内容超过此限制时:
- 服务器优雅地截断
- 提供清晰的截断通知
- 提出获得更具体结果的方法
与Firecrawl的比较
| 功能 | 此服务器 | Firecrawl |
|---|---|---|
| 成本 | 免费、开源 | 付费API(带免费层) |
| API密钥 | 无需 | 必填 |
| 单URL抓取 | ✅ | ✅ |
| 批量报废 | ✅ (20个网址) | ✅ |
| 网站爬行 | ✅ | ✅ |
| 链接提取 | ✅ | ✅ (地图功能) |
| JavaScript渲染 | ✅ (剧作家)✅ | |
| 截图 | ✅ | ✅ |
| 多种格式 | ✅ | ✅ |
| AI提取 | ❌ | ✅ |
| 网页搜索 | ❌ | ✅ |
| 速率限制 | 无 | 是(基于计划) |
技术细节
构建于
- FastMCP:MCP官方Python SDK
- 美丽的Soup4:HTML解析
- lxml 文件:快速HTML/XML处理
- html2text:HTML到Markdown的转换
- httpx:现代异步HTTP客户端
- 剧作家:浏览器自动化(可选)
建筑
服务器遵循MCP最佳实践:
- 异步/等待所有I/O操作
- 用于输入验证的Pydantic v2模型
- 全面的错误处理
- 更好的用户体验工具注释
- 响应格式灵活性
- 字符限制保护
故障排除
“找不到模块'剧作家'”
安装Playwright和浏览器:
pip install playwright
playwright install chromium“连接超时”错误
- 增加代码中的默认超时时间
- 检查您的互联网连接
- 某些站点可能会阻塞刮板
“请求太多”/429错误
- 增加请求之间的延迟
- 一些网站有速率限制
- 考虑使用代理(修改代码)
响应被截断
- 使用更具体的选择器
- 删除特定部分而不是整页
- 使用更紧凑的JSON格式
- 减少
max_pages或max_depth用于爬行
最佳实践
- 尊重robots.txt:检查是否允许刮擦
- 速率限制:不要用请求淹没服务器
- 法律遵循:确保您有权抓取内容
- 从小事做起:爬行前使用单页进行测试
- 使用特定的选择器:对于JavaScript渲染,请等待特定元素
贡献
此服务器是开源的,欢迎投稿!请随意:
- 报告错误
- 建议功能
- 提交拉取请求
- 改进文档
许可证
MIT许可证-可根据需要自由使用和修改。
支持
对于问题和疑问:
- 在GitHub上打开一个问题
- 检查故障排除部分
- 在modelcontextprotocol.io上查看MCP文档
______________________________________________________________________
内置❤️ 遵循MCP最佳实践
