ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenClaw 自动爬取网站内容实战:用 TaoToken 统一 Key 打通配置链路,每天节省 2 小时

OpenClaw 自动爬取网站内容实战:用 TaoToken 统一 Key 打通配置链路,每天节省 2 小时 1. 为什么你的 OpenClaw 爬虫总是跑一半就断每天手动打开七八个网站复制标题、粘贴到表格、再整理成日报这套动作我做过整整两年。最崩溃的不是累是漏。某个竞品凌晨改了价格第二天上午才发现商机已经凉了。后来我把这套流程交给 OpenClaw配合 TaoToken 统一 Key 打通模型调用链路现在每天早上八点一份整理好的 Markdown 报告已经躺在 output 目录里我只需要扫一眼。OpenClaw 自动爬取网站内容这件事本质上拆成三段抓取、理解、落盘。抓取靠 requests 或 Playwright理解靠大模型做摘要和分类落盘靠脚本写文件或发通知。真正卡住大多数人的不是抓取代码而是第二段——模型调用。你可能有五六个技能都要调模型每个技能配一套 Key改一次配置要翻五个文件某个 Key 额度用完整个链路静默失败日志里只有一行 timeout。这篇要解决的就是这个。我会给你一份可直接复制的 settings.json 骨架把 OpenClaw 的模型通道统一指向 TaoToken然后跑一次完整的抓取验证从触发到落盘全链路走通。适合已经装好 OpenClaw、想把它真正用起来的同学也适合被多 Key 管理折磨过的朋友。TaoToken 在这里的角色是统一入口。官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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 指向 TaoTokenbase_url 用 https://taotoken.net/apiapi_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或~/.zshrcexport TAOTOKEN_API_KEYsk-你的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, timeout30): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } try: resp requests.get(url, headersheaders, timeouttimeout) 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, limit10): 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(stripTrue), 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, encodingutf-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 Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 按用量规划比单次调用更划算。如果你只是想先验证模型效果模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 直接开聊不用配环境。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 参数细节都在里面。我自己的做法是settings.json 里只留 provider 和 base_urlKey 永远走环境变量技能代码里不出现任何鉴权信息。这样换机器、换 Key、加技能都只动一处。爬虫这东西稳定比聪明重要配置干净了它才能每天准时把结果放到你面前。
返回列表