1. 为什么你的 OpenClaw 爬虫总是跑一半就断
每天手动打开七八个网站,复制标题、粘贴到表格、再整理成日报,这套动作我做过整整两年。最崩溃的不是累,是漏。某个竞品凌晨改了价格,第二天上午才发现,商机已经凉了。后来我把这套流程交给 OpenClaw,配合 TaoToken 统一 Key 打通模型调用链路,现在每天早上八点,一份整理好的 Markdown 报告已经躺在 output 目录里,我只需要扫一眼。
OpenClaw 自动爬取网站内容这件事,本质上拆成三段:抓取、理解、落盘。抓取靠 requests 或 Playwright,理解靠大模型做摘要和分类,落盘靠脚本写文件或发通知。真正卡住大多数人的不是抓取代码,而是第二段——模型调用。你可能有五六个技能都要调模型,每个技能配一套 Key,改一次配置要翻五个文件,某个 Key 额度用完整个链路静默失败,日志里只有一行 timeout。
这篇要解决的就是这个。我会给你一份可直接复制的 settings.json 骨架,把 OpenClaw 的模型通道统一指向 TaoToken,然后跑一次完整的抓取验证,从触发到落盘全链路走通。适合已经装好 OpenClaw、想把它真正用起来的同学,也适合被多 Key 管理折磨过的朋友。
TaoToken 在这里的角色是统一入口。官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 上有完整的模型列表和接入说明,API 地址是 https://taotoken.net/api,一个 Key 覆盖多个模型,OpenClaw 里所有技能共用这一套配置,改一处全局生效。下面直接进配置。
2. TaoToken 前置:拿到 Key 并确认通道可用
在动 settings.json 之前,先把 Key 拿到手,并且确认这个 Key 能正常调通。这一步不做,后面配置写完也是白搭。
打开 https://taotoken.net/api-keys ,登录后创建一个新 Key。建议按用途命名,比如openclaw-crawler,方便以后排查是哪个项目在用。创建完复制出来,只显示一次,丢了就重新建。
拿到 Key 之后,先用 curl 验证一下通道是否通。这一步很关键,能提前排除网络层和鉴权层的问题:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复ok"}], "max_tokens": 10 }'返回里如果能看到choices字段和内容,说明 Key 和通道都没问题。如果返回 401,检查 Key 有没有复制完整;返回 404,检查 model 名称拼写;返回超时,检查本机网络出口。
注意:Key 不要写进会提交到 Git 的文件里。后面配置里我会用环境变量引用,settings.json 里只放变量名。
模型名称这块,TaoToken 支持的模型列表在 https://taotoken.net/doc 有完整对照表。爬虫场景我一般用 claude-sonnet-4 做内容理解和摘要,速度快、长文本处理稳。如果你的抓取量特别大,可以换成更轻的模型做初筛,重模型只处理需要深度理解的部分。
3. 可复制配置:settings.json 骨架与统一 Key 接入
OpenClaw 的配置入口是 settings.json,默认在~/.openclaw/settings.json。如果你之前改过,先备份一份:
cp ~/.openclaw/settings.json ~/.openclaw/settings.json.bak下面是完整的骨架,直接替换你原来的模型相关段落即可。核心思路是把 provider 指向 TaoToken,base_url 用 https://taotoken.net/api,api_key 从环境变量读:
{ "model": { "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "claude-sonnet-4-20250514", "timeout": 120, "max_retries": 3 }, "skills": { "enabled": [ "web-crawler" ], "web-crawler": { "output_dir": "~/openclaw-crawler/output", "log_dir": "~/openclaw-crawler/logs", "request_timeout": 30, "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "max_items_per_source": 10 } }, "schedule": { "timezone": "Asia/Shanghai", "jobs": [ { "name": "daily-news-crawl", "cron": "0 8 * * *", "skill": "web-crawler", "input": { "urls": [ "https://36kr.com/", "https://www.huxiu.com/" ], "type": "news", "output": "news-{date}.md" } } ] } }几个参数说明一下。api_key_env指向环境变量名,不直接写 Key,这样 settings.json 可以安全地放进版本管理。timeout设 120 秒,因为爬取加模型理解可能耗时较长,设太短会中途断掉。max_retries设 3,网络抖动时自动重试,避免一次失败就丢任务。
环境变量这样设置,写进~/.bashrc或~/.zshrc:
export TAOTOKEN_API_KEY="sk-你的Key"然后source ~/.bashrc生效。验证一下:
echo $TAOTOKEN_API_KEY能打印出 Key 就对了。
技能目录结构保持这样,handler.py 负责抓取和解析,SKILL.md 描述触发词:
mkdir -p ~/openclaw-crawler/{output,logs,skills/web-crawler}handler.py 里调用模型的部分,统一走 OpenClaw 的模型接口,不要自己再写一套 HTTP 请求。这样 settings.json 里的 provider 配置才能全局生效:
import os import requests from bs4 import BeautifulSoup from datetime import datetime def fetch_url(url, timeout=30): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } try: resp = requests.get(url, headers=headers, timeout=timeout) resp.encoding = resp.apparent_encoding return {"success": True, "html": resp.text} except Exception as e: return {"success": False, "error": str(e)} def parse_news(html, limit=10): soup = BeautifulSoup(html, "lxml") items = soup.select(".news-item, .article, .post") results = [] for item in items[:limit]: title = item.select_one("h2, h3, .title") link = item.select_one("a") if title: results.append({ "title": title.get_text(strip=True), "link": link.get("href", "") if link else "" }) return results def handle(input_data): urls = input_data.get("urls", []) all_news = [] for url in urls: r = fetch_url(url) if r["success"]: all_news.extend(parse_news(r["html"])) report = f"# 新闻报告 {datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n" for i, n in enumerate(all_news, 1): report += f"{i}. [{n['title']}]({n['link']})\n" out = os.path.expanduser(f"~/openclaw-crawler/output/news-{datetime.now().strftime('%Y%m%d')}.md") with open(out, "w", encoding="utf-8") as f: f.write(report) return {"success": True, "output": out, "count": len(all_news)}这段代码里没有出现任何 Key,模型调用由 OpenClaw 框架根据 settings.json 自动注入。这就是统一 Key 的价值——你的业务代码干净,配置集中,换 Key 只改环境变量。
4. 验证请求:跑一次完整抓取并确认落盘
配置写完,跑一次完整链路。先重载配置:
openclaw config reload然后手动触发一次抓取任务,不要等定时:
openclaw agent --message "爬取 https://36kr.com/ 的新闻,整理成报告保存到 output 目录"观察终端输出。正常流程会依次打印:加载技能 web-crawler、请求目标 URL、解析条目、调用模型整理、写入文件。如果中间卡在模型调用,大概率是环境变量没生效或 Key 有问题。
跑完后检查落盘结果:
ls -lh ~/openclaw-crawler/output/ cat ~/openclaw-crawler/output/news-$(date +%Y%m%d).md你应该能看到一份带标题和链接的 Markdown 报告。条目数量取决于目标网站当天的结构,一般 8 到 10 条。
再验证定时任务是否注册成功:
openclaw schedule list输出里应该能看到daily-news-crawl这条,cron 表达式是0 8 * * *。如果没看到,检查 settings.json 里 schedule 段落有没有语法错误,JSON 对逗号和引号很敏感。
到这里,一次完整抓取验证就完成了。从触发到落盘,全链路走通,模型调用走的是 TaoToken 统一通道。接下来把它交给定时任务,你每天只需要看结果。
5. 本篇常见错排查
配置跑不通,九成问题出在下面这几个地方。我按出现频率排一下。
Key 读取失败。现象是日志里报api_key not found或 401。先确认环境变量在当前 shell 里能打印出来,再确认 OpenClaw 启动时继承了这个环境变量。如果你用 systemd 或 supervisor 托管,环境变量要在服务配置里单独声明,不会自动继承 shell 的。
模型名称不匹配。现象是 404 或model not found。TaoToken 的模型名称以 https://taotoken.net/doc 上的对照表为准,不要凭记忆写。改完 settings.json 记得 reload。
抓取超时。现象是requests.exceptions.Timeout。把request_timeout从 30 调到 60,同时确认目标网站没有对你的出口 IP 做频率限制。如果连续抓多个页面,加个time.sleep(1)在请求之间。
解析结果为空。现象是报告里一条新闻都没有。这是选择器不匹配,目标网站改版了。用浏览器开发者工具重新确认.news-item这类选择器,或者换成更通用的article标签。
落盘路径不存在。现象是FileNotFoundError。确认~/openclaw-crawler/output目录真实存在,脚本里用os.path.expanduser展开~,不要直接写~/。
定时任务不触发。现象是到点了没动静。先openclaw schedule list确认任务注册了,再看 logs 目录有没有执行记录。cron 表达式是五段式,0 8 * * *是每天八点,别写成六段。
排障时优先看 logs 目录下的 crawler.log,里面记录了每次请求的 URL、状态码和耗时,比终端输出详细得多。
6. 把 Key 管好,爬虫才能长期跑
这套配置跑通之后,我建议你做一件事:把所有需要调模型的技能,都指向同一个 TaoToken Key。不要每个技能配一套,那是给自己埋雷。统一之后,额度监控、Key 轮换、故障排查都只在一个地方做。
长期跑编码类任务或者 Agent 类任务的同学,可以看一下 Coding Plan,https://taotoken.net/coding-plan?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= ,直接开聊不用配环境。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,参数细节都在里面。
我自己的做法是,settings.json 里只留 provider 和 base_url,Key 永远走环境变量,技能代码里不出现任何鉴权信息。这样换机器、换 Key、加技能,都只动一处。爬虫这东西,稳定比聪明重要,配置干净了,它才能每天准时把结果放到你面前。