1. 从 requests 到 MCP:我为什么把爬虫脚本删了
如果你写过 Python 爬虫,大概率经历过这套流程:requests 发请求、BeautifulSoup 或 lxml 解析 HTML、正则清洗字段、pandas 存 CSV,遇到动态渲染再上 Selenium 或 Playwright。脚本能跑,但维护成本高得离谱——目标站点改一次 DOM 结构,你的选择器全废;加个登录态、翻页、限速、重试,代码量翻三倍。更别说每个新需求都要重新写一遍解析逻辑,本质上你在做的是「把网页翻译成结构化数据」这件重复劳动。
MCP(Model Context Protocol)改变的是这件事的分工方式。它把「抓取 + 解析」封装成一个标准化的服务,大模型通过工具调用的方式直接拿到结构化结果,你不再需要手写解析器。Playwright MCP、Fetch MCP、Chrome MCP 这类服务已经能把网页内容、搜索结果、页面交互都暴露成工具,客户端(Cursor、VS Code、Claude Code 等)里对话就能触发采集。适合谁?适合那些需要频繁采集公开数据、但不想为每个站点维护一套解析脚本的人,也适合把采集能力接进 Agent 工作流的开发者。
但这里有个现实问题:MCP 服务本身要调用模型来理解页面、决定抓取策略,如果你每个 MCP 客户端都单独配一套 Key,管理会非常乱。这篇就讲怎么从零搭一个可复用的 MCP 抓取服务,并把它统一接到 TaoToken 的 Key/API 通道上,让所有客户端共用一个入口。下面给出 config.toml 和 settings.json 的可复制骨架、服务注册步骤,以及一次真实抓取请求的验证动作。
2. 前置准备:TaoToken 统一 Key 与 MCP 运行环境
先说清楚 TaoToken 在这里的角色。它是一个统一的模型 API 通道,你申请一个 Key,就能在多个客户端和 MCP 服务里复用,不用每个工具单独去配。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,配置里直接填)。
你需要准备三样东西:
第一,一个 TaoToken 的 API Key。登录后进控制台,在 API Keys 页面创建一个,复制出来备用。这个 Key 后面会同时用在 MCP 服务的环境变量和客户端配置里。
第二,Node.js 环境。大部分 MCP 服务是 npm 包形式发布的,建议 Node 18 以上。用node -v确认一下,没有的话去官网装 LTS 版本。
第三,一个支持 MCP 的客户端。Cursor、VS Code(配合 Continue 或 Cline 插件)、Claude Code 都可以。本文以 VS Code + Cline 和 Claude Code 两种配置为例,因为它们的配置文件格式比较典型,其他客户端照猫画虎即可。
注意:MCP 服务注册时,环境变量里的 API Key 不要硬编码进会提交到 Git 的文件。用
.env或者客户端提供的密钥管理功能,避免泄露。
环境确认命令:
node -v npm -v npx -v三个命令都能输出版本号,说明环境就绪。如果npx报错,通常是 npm 没装全,重装 Node 即可。
3. 可复制配置:config.toml 与 settings.json 骨架
MCP 服务的配置分两层:一层是服务本身的运行参数(比如用哪个模型、走哪个 API 基址),一层是客户端怎么注册这个服务。前者用config.toml,后者用settings.json。
先看config.toml。这个文件放在你的 MCP 服务工作目录下,作用是告诉服务:模型请求走 TaoToken 的通道,用哪个模型,超时多久。
# config.toml - MCP 抓取服务运行配置 [server] name = "mcp-fetch-service" transport = "stdio" timeout = 120 [model] # 统一走 TaoToken 通道 base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" model = "claude-sonnet-4-20250514" max_tokens = 8192 [fetch] # 抓取行为参数 user_agent = "Mozilla/5.0 (compatible; MCPFetch/1.0)" max_content_length = 200000 respect_robots = true retry_times = 3 retry_delay = 2 [parse] # 解析策略:让模型决定抽取哪些字段 mode = "llm_extract" output_format = "json"这里的关键是base_url指向 TaoToken 的 API 地址,api_key用环境变量注入,不要把真实 Key 写进文件。model字段填你账号下可用的模型名,具体以控制台模型列表为准。
再看客户端的settings.json。以 Cline(VS Code 插件)为例,MCP 服务注册写在它的配置里:
{ "mcpServers": { "fetch-service": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-fetch"], "env": { "TAOTOKEN_API_KEY": "你的Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "MCP_CONFIG_PATH": "./config.toml" } } } }如果你用的是 Claude Code,配置写在~/.claude/settings.json或者项目级的.mcp.json里,结构类似:
{ "mcpServers": { "fetch-service": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-fetch"], "env": { "TAOTOKEN_API_KEY": "你的Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api" } } } }两个配置的差异只在文件位置和字段层级,核心都是command + args + env三件套。env里把 TaoToken 的 Key 和基址传进去,MCP 服务启动时就能读到。
提示:
npx -y会自动下载并运行包,第一次启动会慢几秒。如果公司网络对 npm 源有限制,先配好 registry。
4. 注册 MCP 服务并跑通一次真实抓取
配置写好后,下一步是让客户端识别到这个服务。以 VS Code + Cline 为例,保存settings.json后重启窗口,Cline 面板里会出现 MCP 服务的连接状态。如果显示绿色或「connected」,说明注册成功。
Claude Code 的话,在项目目录下执行:
claude mcp list能看到fetch-service出现在列表里,状态是 connected,就对了。如果没出现,检查settings.json的 JSON 格式有没有多余逗号,这是最常见的低级错误。
服务连上后,验证链路是否真的通。在客户端对话框里输入一句自然语言指令,比如:
帮我抓取 https://example.com 这个页面的标题和正文前200字,用 JSON 返回MCP 服务收到请求后,会先通过 TaoToken 通道调用模型,模型决定用哪个抓取工具、怎么解析,然后返回结构化结果。正常输出类似:
{ "title": "Example Domain", "content": "This domain is for use in illustrative examples in documents..." }如果你看到的是模型在「思考」然后给出结果,而不是报 401 或连接超时,说明 TaoToken 的 Key 和基址配置正确,MCP 服务也正常工作了。这一步是整个链路的关键验证点:模型调用走通了,抓取工具执行了,结果解析回来了。
再试一个稍微复杂的场景,验证多步抓取:
抓取 https://example.com 页面里所有链接的 href,去重后返回列表MCP 服务会调用页面解析工具,提取所有<a>标签的 href 属性,模型负责去重和格式化。这一步能跑通,说明你的 MCP 抓取服务已经具备实际可用性,可以接进日常工作了。
5. 常见报错排查:从 401 到工具未注册
链路跑不通时,报错通常集中在几个地方。我按出现频率排一下。
401 Unauthorized 或 invalid api key:TaoToken 的 Key 没传对。检查settings.json里env.TAOTOKEN_API_KEY的值,注意有没有多余空格或引号。如果 Key 是从控制台复制的,确认没有复制到换行符。另外确认base_url是https://taotoken.net/api,不要多加斜杠或路径。
MCP server not found 或 command not found:npx找不到包。先手动执行npx -y @modelcontextprotocol/server-fetch --help,看能不能跑起来。如果报网络错误,检查 npm registry 配置;如果报包不存在,确认包名拼写,不同 MCP 服务的包名不一样。
工具调用返回空或超时:抓取目标站点响应慢,或者timeout设得太短。把config.toml里的timeout调到 180,retry_times调到 3。如果是动态渲染页面,Fetch MCP 可能拿不到内容,需要换成 Playwright MCP 或 Chrome MCP,它们能执行 JavaScript。
模型返回乱码或截断:max_tokens太小。抓取长页面时,模型需要足够的输出空间来组织结构化数据,把max_tokens提到 8192 或更高。同时检查max_content_length,如果页面内容超过这个值会被截断,适当调大。
客户端重启后服务消失:配置文件路径不对。Cline 读的是工作区或用户级的settings.json,Claude Code 读的是~/.claude/settings.json或项目级.mcp.json。确认你改的文件是客户端实际加载的那个。
注意:如果报错信息里出现「connection refused」且指向本地端口,通常是 MCP 服务进程没起来。检查
command和args是否能手动执行成功,环境变量是否完整。
排查顺序建议:先确认 Key 和基址,再确认服务进程能启动,最后确认工具能被模型调用。大部分问题在前两步就能定位。
6. 把采集能力接进你的工作流
跑通之后,这个 MCP 抓取服务的价值在于复用。你不需要为每个新站点写解析脚本,只需要在对话里描述你要什么字段,模型会通过 MCP 工具去抓取和抽取。对于需要长期运行的采集任务,可以把它接进 Coding Plan 里,让 Agent 按计划执行抓取、清洗、入库的流程,Key 依然走 TaoToken 统一通道,不用每个环节单独配。
如果你还没创建 Key,先去控制台建一个:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建完在 API Keys 页面复制,填进上面的settings.json就能用。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各客户端的详细配置示例,遇到格式问题可以对照。
想先验证模型通道是否正常,可以用模型对话页面发一条测试消息:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果那边能正常返回,说明 Key 和基址没问题,MCP 这边的报错就集中在服务注册和工具调用上。
长期做编码和 Agent 工作流的,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它适合把采集、分析、写回这套流程固化下来,不用每次手动触发。
最后说个实际经验:MCP 抓取服务最适合的是「结构不固定、需要模型理解」的页面,比如新闻列表、商品详情、搜索结果。如果是结构极其稳定的 API 或静态页面,传统脚本反而更快。工具选型看场景,别为了用 MCP 而用 MCP。