关于 HasData Web Scraping
HasData Web Scraping 是面向 MCP 客户端的托管网页抓取服务,适用于需要读取公开网页内容的用户。它支持 JavaScript 渲染、代理访问,并可返回多种文本或结构化格式。
主要功能
- 01抓取公开网页
- 02按需渲染 JavaScript
- 03使用数据中心或住宅代理
- 04输出 Markdown、文本、HTML 或 JSON
- 05通过 CSS 规则提取字段与链接
适用场景
- 01提取文档页面中的代码块
- 02抓取动态加载的网页内容
- 03按指定字段整理页面数据
MCP 相关
作为托管远程服务,它向 MCP 客户端提供网页抓取工具,并提供抓取网页的提示词及代理选项资源。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.hasdata.com/mcp?apis=web_scrapingclaude mcp add --transport http com-hasdata-web-scraping https://mcp.hasdata.com/mcp?apis=web_scraping{"mcpServers":{"com-hasdata-web-scraping":{"type":"http","url":"https://mcp.hasdata.com/mcp?apis=web_scraping"}}}在 Cursor 中打开{"servers":{"com-hasdata-web-scraping":{"type":"http","url":"https://mcp.hasdata.com/mcp?apis=web_scraping"}}}在 VS Code 中打开{"mcpServers":{"com-hasdata-web-scraping":{"type":"http","url":"https://mcp.hasdata.com/mcp?apis=web_scraping"}}}{"mcpServers":{"com-hasdata-web-scraping":{"serverUrl":"https://mcp.hasdata.com/mcp?apis=web_scraping"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://mcp.hasdata.com/mcp?apis=web_scraping需要授权工具
2| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pets | number | 否 | 宠物数量。 |
| neLat | number | 否 | 地图边界框东北角的纬度。提供全部四个边界框坐标后,将在框内搜索房源,而不是按位置搜索。 |
| neLng | number | 否 | 地图边界框东北角的经度。 |
| swLat | number | 否 | 地图边界框西南角的纬度。 |
| swLng | number | 否 | 地图边界框西南角的经度。 |
| adults | number | 否 | 成人数量。 |
| checkIn | string | 是 | 房源的入住日期。 |
| infants | number | 否 | 婴幼儿数量。 |
| checkOut | string | 否 | 房源的退房日期。 |
| children | number | 否 | 子女数量。 |
| location | string | 否 | 用于搜索房源的地点。除非提供完整地图边界框(neLat、neLng、swLat、swLng),否则必填。 |
| nextPageToken | string | 否 | 用于获取下一页结果的令牌。 |
详细介绍
网页抓取 MCP 服务
一个托管的 Model Context Protocol(MCP)服务,为 Claude、Cursor、Windsurf 和任何其他 MCP 客户端提供一个只读工具,用于获取任意公开网页。它通过托管代理发出请求,在页面需要时渲染 JavaScript,并返回干净的 Markdown、纯文本、原始 HTML 或结构化 JSON,无需自行托管,也无需在技术栈中配置浏览器。
当网站没有专用 API 时,这就是备用方案。如果网站已收录在 HasData 目录中,该工具会返回解析后的字段,而此工具会返回网页。
每月提供 1,000 个免费额度,无需银行卡。 普通抓取消耗 1 个额度,因此免费套餐可支持 1,000 次抓取。
https://mcp.hasdata.com/mcp?apis=web_scraping
目录
所需条件
一个 MCP 客户端,以及从 控制面板获取的 HasData API 密钥,注册免费且无需银行卡。这是一个远程服务,因此最简单的接入方式是使用 URL 和 x-api-key 请求头,无需运行容器。只支持 stdio 的客户端可通过一个轻量启动器访问该服务,该启动器已发布到 npm,包名为 @hasdata/web-scraping-mcp;也已发布到 PyPI,包名为 hasdata-web-scraping-mcp,如下所示。
快速开始
所有客户端使用相同的服务 URL。我们已在 Claude Code 和 Claude Desktop 中实际运行。其他配置块遵循各客户端针对远程服务的文档格式。
| 字段 | 值 |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=web_scraping |
| 传输方式 | HTTP,可流式传输 |
| 身份验证标头 | x-api-key: HASDATA_API_KEY |
支持 OAuth 的客户端可以将相同的 URL 添加为连接器,然后登录,无需在配置文件中填写密钥。
Claude Code
claude mcp add --transport http web-scraping "https://mcp.hasdata.com/mcp?apis=web_scraping" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
依次点击 Settings、Connectors、Add custom connector,然后粘贴 https://mcp.hasdata.com/mcp?apis=web_scraping 并登录。
对于配置文件方式,Claude Desktop 只加载本地(stdio)服务,因此需要通过 stdio 启动器访问远程服务。@hasdata/web-scraping-mcp 软件包就是该启动器,它会从环境变量中读取密钥。将以下内容添加到 claude_desktop_config.json:
{
"mcpServers": {
"web-scraping": {
"command": "npx",
"args": ["-y", "@hasdata/web-scraping-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
如果使用 Python 而不是 Node,请将启动器替换为 PyPI 软件包,uvx 无需手动安装即可运行它:
{
"mcpServers": {
"web-scraping": {
"command": "uvx",
"args": ["hasdata-web-scraping-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
每个项目都使用 ~/.cursor/mcp.json,或者单个项目使用 .cursor/mcp.json:
{
"mcpServers": {
"web-scraping": {
"url": "https://mcp.hasdata.com/mcp?apis=web_scraping",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
使用 ~/.codeium/windsurf/mcp_config.json。Windsurf 将该字段称为 serverUrl,而不是 url:
{
"mcpServers": {
"web-scraping": {
"serverUrl": "https://mcp.hasdata.com/mcp?apis=web_scraping",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
工作区中的 .vscode/mcp.json:
{
"servers": {
"web-scraping": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=web_scraping",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
提示词示例
- 获取此页面并将其整理成 Markdown 摘要。
- 阅读此文档页面,并提取其中的所有代码块。
- 以 JSON 格式获取此网站首页上的标题和链接。
- 此页面通过 JavaScript 加载内容,因此请渲染页面,并等待结果列表出现后再读取。
- 通过德国住宅代理获取此页面,并告诉我价格是否有所不同。
- 截取此页面的屏幕截图。
每个示例都只需调用一次即可完成。它们的区别在于你要求浏览器执行多少操作,而这决定了调用成本。
工具
| 工具 | 返回内容 |
|---|---|
hasdata_web_scraping_web_scraping_scrapeWebPage | HTML、文本、Markdown 和/或 JSON,以及状态码、提取的电子邮件和链接、CSS 选择器提取结果,以及按架构结构化的 AI 字段。普通抓取每次调用消耗 1 个积分,启用 JS 渲染则消耗 10 个积分 |
只有一个工具。成本取决于你启用的功能,详见定价、免费额度和限制。
抓取网页
hasdata_web_scraping_web_scraping_scrapeWebPage
抓取一个 URL。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 是 | 要抓取的页面 |
outputFormat | array | 可选值:markdown、text、html、json。参见输出格式 | |
jsRendering | boolean | 在浏览器中渲染页面。默认开启,也是影响成本的主要因素 | |
proxyType | string | datacenter 或 residential | |
proxyCountry | string | US、UK、DE、IE、FR、IT、SE、BR、CA、JP、SG、IN 或 ID | |
headers | object | 自定义请求标头 | |
wait | number | 加载后等待的毫秒数 | |
waitFor | string | 读取页面前等待的 CSS 选择器 | |
jsScenario | array | 要在页面上执行的操作。见下文 | |
extractRules | object | 用于提取命名字段的 CSS 选择器 | |
aiExtractRules | object | 由大模型从页面中填充的类型化架构 | |
extractLinks | boolean | 收集页面中的链接 | |
extractEmails | boolean | 收集页面中的电子邮件地址 | |
screenshot | boolean | 捕获渲染后的页面 | |
blockResources | boolean | 跳过图片和样式表 | |
blockAds | boolean | 跳过广告请求 | |
blockUrls | array | 跳过这些 URL | |
includeOnlyTags | array | 仅保留与这些选择器匹配的元素 | |
excludeTags | array | 移除与这些选择器匹配的元素 | |
removeBase64Images | boolean | 从输出中移除内嵌的 base64 图片 |
extractRules 将字段名称映射到 CSS 选择器;使用 @attr 可读取属性而非文本。
{ "title": "h1", "link_href": "a#link @href", "page_text": "body" }
jsScenario 是一个按顺序执行的操作数组,涵盖 click、wait、waitFor、waitForAndClick、scrollX、scrollY、fill 和用于执行任意 JavaScript 的 evaluate。此功能需要开启 jsRendering。
aiExtractRules 描述所需的数据结构,并让模型从 HTML 中填充内容。每个键都是一个输出字段,类型可以是 string、number、boolean、list,或用于嵌套对象的 item。
提示词和资源
此服务提供一个提示词,即现成的工作流,客户端可以直接提供给用户,而无需让用户自行编写工具调用。
| 提示词 | 功能 |
|---|---|
scrape_web_page | 抓取任意公开网页并总结其内容。 |
此外,该服务还提供 2 个资源,每个资源对应一个可接受值为固定列表的参数。读取资源比从被拒绝的调用中了解可用选项更省事,而且不消耗额度。每个 URI 的格式为 hasdata://web_scraping/<parameter>。
| 参数 | 值数量 | 用途 |
|---|---|---|
proxyType | 2 | 要使用的代理类型。 |
proxyCountry | 13 | 可选的代理国家/地区代码。 |
两个列表均无需 API 密钥即可获取,因此客户端可以在用户注册前读取它们。
输出格式
首次调用前值得先了解这一点,因为响应结构会随 outputFormat 改变。
仅请求 markdown、text 或 html 中的一种,内容就会以纯字符串的形式出现在顶层的 text 中。
{
"url": "https://api.hasdata.com/scrape/web/",
"status": 200,
"json": null,
"text": "# Example Domain\n\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\n\n[Learn more](https://iana.org/domains/example)\n"
}
单独请求 json,或将其与其他格式一起请求时,所有内容都会移至 json 中,顶层的 text 将变为 null,请求的格式则会作为键与页面元数据一同放在其中。
{
"json": {
"requestMetadata": { "id": "7764031a-43f7-4102-8561-a7b7a6f1cbf5", "status": "ok" },
"statusCode": 200,
"statusText": "OK",
"headers": { "server": "nginx", "content-type": "text/html; charset=utf-8" },
"extractedData": { "title": "Hacker News", "firstStory": ["iPhone Duo", "apple.com", "Show HN: What if the speed of light was 5 km/h?"] }
},
"text": null
}
extractedData 保存 extractRules 的结果。如果一个选择器匹配多个元素,就会返回包含所有匹配项的数组;因此,在列表页面上使用 .titleline a 会返回所有匹配项,而不只是第一个。
错误和失败路径
应对这些情况做好规划,而不是假设一切都会顺利。
除非 outputFormat 包含 json,否则 extractLinks 和 extractEmails 不会执行任何操作。 它们会将 links 和 emails 放在 json 对象中,而普通 Markdown 响应中没有可供它们放置的位置。使用 outputFormat: ["text"] 请求它们,只会返回文本,不会返回链接,且不会提示任何错误。
目标页面返回 404 或 403 也算调用成功。 页面自身的状态会作为 statusCode 出现在 json 中,或作为顶层的 status 返回;无论哪种情况,请求都会计费。解析正文前先检查状态。
jsRendering 默认开启,也是调用成本所在。 关闭它可将一次抓取的成本从 10 个积分降至 1 个。大多数静态页面、文档、文章以及任何服务端渲染的页面都不需要它。如果不启用时内容为空,再将它打开。
waitFor 优先于 wait。 固定延迟只是猜测:页面加载慢时可能不够,加载快时又会造成浪费。CSS 选择器会等待你实际需要的内容,并在它出现时立即返回。
住宅代理的价格是数据中心代理的 5 到 15 倍。 只有数据中心抓取被拦截时才使用住宅代理,不要默认使用。
includeOnlyTags 和 excludeTags 接受 querySelectorAll 选择器。 选择器无效时不会筛除任何内容,也不会报错,因此响应内容多得可疑,往往意味着有拼写错误。
aiExtractRules 会让模型处理 HTML,因此既非免费,也无法保证结果一致。 对同一页面调用两次,措辞可能不同。如果 CSS 选择器能完成任务,extractRules 成本更低,结果也可重复。
包含数据的结果还会附带 requestMetadata.id,联系支持时请提供该 ID。
定价、免费套餐和限制
费用取决于两个开关,其他因素不会改变费用。
| 数据中心代理 | 住宅代理 | |
|---|---|---|
jsRendering: false | 1 个积分 | 5 个积分 |
jsRendering: true | 10 个积分 | 15 个积分 |
渲染默认开启,因此未配置的调用费用为 10 个积分。使用 jsRendering: false 抓取静态页面只需 1 个积分;无需浏览器时,这是目录中成本最低的工具。
免费套餐每月提供 1,000 个积分,无需绑定银行卡。这相当于 1,000 次普通抓取,或 100 次渲染抓取。积分会随计费周期续订。
付费套餐起价为每月 $59,包含 200,000 个积分,相当于 200,000 次普通抓取或 20,000 次渲染抓取。随着用量增加,大用量套餐的单价会降低。
套餐还会决定并发数。免费套餐允许同时发起 1 个请求,Startup 为 5 个,Basic 为 15 个,Growth 套餐则从 50 个到 500 个不等。对于无人值守的任务,遇到 429 时应采用退避策略重试,因为 Agent 抓取 URL 列表时,会比你先触及上限。
只有成功的请求才会扣除积分。页面返回 404,仍算成功抓取了一个返回 404 的页面。
对比
值得比较的是自行抓取页面,以及本目录中的其他工具。
在自己的代码中使用 fetch | 专用 HasData 工具 | 此服务 | |
|---|---|---|---|
| 受机器人防护拦截 | 经常 | 已处理 | 已处理 |
| JavaScript 密集型页面 | 需要自己运行浏览器 | 已处理 | 一个参数 |
| 地理定位 | 自己的代理 | 内置 | 一个参数 |
| 输出 | 原始 HTML | 该网站的解析字段 | Markdown、文本、HTML 或 JSON |
| 覆盖范围 | 任何网站 | 有对应工具的网站 | 任何公开网站 |
| 费用 | 自己的基础设施 | 按次计费 | 每次调用 1 个积分起 |
与专用工具相比,决定性因素是覆盖范围。Amazon、Zillow、Yelp 等网站会返回类型化字段,因为有人维护着这些网站的解析器。此服务会返回任何网站的页面,并将解析工作留给你;只有在没有专用工具时,这种取舍才合适。
与自行使用 fetch 相比,关键在于目标网站是否会拦截请求。对于友好的页面,自己的代码免费,而此服务不值得花费积分。
常见问题
什么是网页抓取 MCP 服务?
MCP 服务会提供 AI 客户端可调用的工具。此服务允许 Agent 通过托管代理抓取任意公开 URL,并以 Markdown、文本、HTML 或结构化 JSON 的形式返回结果,无需在你的技术栈中配置浏览器或代理池。
我需要自己的代理或无头浏览器吗?
不需要。这两者都由服务端提供。你只需要 HasData 密钥。
如何降低调用费用?
设置 jsRendering: false。这会将费用从 10 个积分降至 1 个。确实需要渲染时,可添加 blockResources,让浏览器跳过图片和样式表。
如何判断页面是否需要渲染?
先不启用渲染抓取一次,花费 1 个积分。如果所需内容已经存在,就完成了。如果返回的正文只是空壳,再启用渲染。
它能填写表单或点击进入下一页吗?
可以,使用 jsScenario 即可。它会按顺序在渲染后的页面上执行 click、fill、waitFor、scrollY 和 evaluate 步骤。
extractRules 和 aiExtractRules 有什么区别?
extractRules 使用 CSS 选择器,成本低、速度快且结果稳定。aiExtractRules 则描述你需要的字段,并让模型读取页面;它适用于无法确定页面结构的情况,但成本更高,而且不同运行结果可能有所不同。
我能获取截图吗?
可以,在启用渲染的调用中设置 screenshot: true 即可。
我能将此服务与其他 HasData API 一起使用吗?
可以。一个密钥即可访问所有服务,apis 参数可通过同一个端点提供它们。将客户端指向 ?apis=web_scraping,google_serp,即可在一个连接中获取这两组工具;也可以指向 mcp.hasdata.com/mcp,获取完整目录。
HasData 与我抓取的网站有关联吗?
没有。HasData 是一家独立服务。此工具会抓取你指定的页面,因此返回的内容取决于该网站发布的内容;你有责任确保使用方式符合该网站的条款以及适用于你的法律。
合规与个人数据
此工具可以抓取你指定的任何网站,因此相比针对特定网站的工具,你需要承担更多责任。开始构建之前,有两点值得考虑。extractEmails 会收集电子邮件地址;根据 GDPR,电子邮件地址属于个人数据,而用于营销时,还受 CAN-SPAM Act、ePrivacy 规则及其对应法规的单独约束。此外,登录页、付费墙页面或被 robots 规则排除的页面,不会因为代理能够访问就变成公开页面。只抓取真正公开的内容,只保留实现目的所需的数据,并确认你自身的义务。
HasData 链接
其他 HasData MCP 服务:Google 搜索、Google 图片、Google Scholar、Google 地图、Google Trends、Bing、DuckDuckGo、YouTube、TikTok、Instagram、Amazon、Walmart、Shopify、Yelp、Yellow Pages、Zillow、Redfin、Airbnb、Booking.com、Indeed、Glassdoor。
开发
启动器是一个连接到远程服务的轻量级 stdio 桥接程序,因此无需构建。
npm install
HASDATA_API_KEY=your_key_here npm test
test/ 中的测试用于验证工具契约,这是本仓库中可能在未提交代码的情况下发生变化的部分。它们会检查 ?apis=web_scraping 是否返回唯一预期的工具、工具名称是否未变、工具是否仍要求 url 且带有说明、此 README 中记录的参数是否仍在架构中,以及正在使用的密钥是否确实可用。
有两个测试会固定输出格式行为,因为这是本 README 中读者最容易遇到问题、也最可能在重构时发生变化的部分。一个测试只请求 markdown,并断言内容以顶层字符串的形式返回。另一个测试使用 extractRules 请求 json,并断言提取结果位于 json 内的 extractedData 中。这两个测试都无需渲染即可运行,因此合计耗费 2 个积分。
契约测试套件还会按计划每周运行一次,因为上游工具列表可能在无人修改此仓库的情况下发生变化。
贡献
如果工具表、响应示例或记录的行为与实际情况不符,欢迎提交问题。我们为此提供了专用模板。欢迎提交相关拉取请求,也欢迎提交关于启动器的改进。
许可证
MIT,详见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。