突破反爬!给小龙虾添加爬虫技能,TaoToken 让 AI 秒变数据高手
1. 小龙虾 AI 助手抓不到数据问题到底出在哪小龙虾类 AI 助手OpenClaw 这类可挂载技能的本地 Agent本身不会主动联网抓数据它只会调用你给它的工具。你问它帮我爬一下某只股票的行情它执行不了不是它笨而是它手里没有爬虫这个技能。这是很多人第一次用 AI Agent 时最困惑的地方模型能力很强但缺一个能真正发出 HTTP 请求、解析 HTML、绕过基础反爬的执行层。我试过直接让助手用内置的网页读取能力去抓行情页结果经常返回空内容或者一段请开启 JavaScript的提示。原因很典型目标站点做了几层拦截。第一层是 User-Agent 校验非浏览器 UA 直接 403第二层是 TLS 指纹识别普通 requests 的握手特征太明显第三层是动态渲染关键数据在 JS 执行后才注入 DOM。这三层叠在一起普通抓取脚本基本全军覆没。Scrapling 这个 Python 库就是冲着这些反爬场景设计的。它基于 Python封装了浏览器指纹伪装、TLS 指纹模拟、自动重试和选择器自适应GitHub 地址是 https://github.com/D4Vinci/Scrapling 。它的定位不是又一个 requests 包装而是把绕过常见反爬这件事做成默认行为。你不需要自己拼 headers、不需要手动处理 Cloudflare 的挑战页它内置的 Fetcher 会帮你把请求伪装成真实浏览器流量。把 Scrapling 挂到小龙虾助手上本质上是给 Agent 补一个能稳定拿到网页原始内容的技能。技能装好之后你对助手说帮我抓取 XX 网站的 XX 数据它会自动调用这个技能拿到 HTML 或结构化内容再交给模型做解析和提取。整个链路是用户自然语言指令 → Agent 识别触发条件 → 调用 fetch.py → Scrapling 抓取 → 返回内容 → 模型解析 → 输出结构化结果。适合谁用三类人最合适。一是做量化或行情监控的需要定时抓取财经页面二是做竞品或舆情分析的需要批量采集公开网页三是单纯想让自己的 AI 助手能上网干活的开发者。前提是你得有一台 Linux 云服务器装好 Python 环境并且已经跑起来一个支持技能挂载的 Agent 框架。本文以 OpenClaw 为例其他框架思路一致改一下技能目录路径即可。需要提前说清楚边界爬虫要遵守目标站点的 robots.txt控制请求频率不要 1 秒发 100 个请求那不是在爬数据是在给自己找封 IP。本文所有示例仅用于学习和技术验证不要用于商业爬取或非法用途。另外遇到验证码或强制登录的站点Scrapling 也抓不了这是能力边界不是配置问题。2. TaoToken 统一 Key 与 API 通道前置准备在写爬虫技能之前先把 AI 侧的调用通道理顺。小龙虾助手在抓完网页后需要把内容交给大模型做解析和字段提取这一步要调模型 API。如果你每个模型都单独配 Key、单独记 Base URL技能脚本里会塞满各种环境变量维护起来很痛苦。TaoToken 的作用就是把这些通道统一成一个入口一个 Key、一个 Base URL背后可以切换不同模型。TaoToken 的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数配置的时候直接用这个干净地址。你需要先去控制台创建一个 API Key控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建 Key 的流程不复杂登录后进控制台找到 API Keys 页面点新建复制生成的 Key。这个 Key 只显示一次复制后存到安全的地方。然后确认你要用的模型 ID比如做代码解析和结构化提取选一个指令跟随能力强的模型就行。模型对话页面在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以先在那里试一下模型能不能正常返回确认通道通了再写进脚本。为什么要在爬虫技能里接 TaoToken而不是让助手直接用内置模型因为技能脚本是独立进程它需要自己发模型请求来做内容解析。把 Base URL 和 Key 统一成 TaoToken 的脚本里只需要读两个环境变量换模型时改一个 Model ID 就行不用动代码。这对后面做定时任务和多站点对比特别重要。配置方式有两种。一种是在服务器上写环境变量适合长期运行另一种是写进技能的配置文件适合快速测试。我建议用环境变量因为技能脚本被 Agent 调用时环境变量会自动继承不用在代码里硬编码密钥。具体操作是在~/.bashrc或 systemd 服务文件里加export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_MODEL你的模型ID加完执行source ~/.bashrc让它生效。验证一下echo $TAOTOKEN_BASE_URL curl -s https://taotoken.net/api/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY | head -c 300如果返回一段 JSON说明 Key 和通道都正常。如果返回 401检查 Key 有没有复制完整、有没有多余空格。这一步做完AI 侧的通道就通了接下来写爬虫技能时解析环节直接复用这套配置。如果你后面要做长期的编码类 Agent 任务比如让助手持续跑抓取加分析可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 配置细节以文档为准。3. 可复制的 Scrapling 技能配置与抓取脚本这一节是核心把技能目录、SKILL.md、fetch.py 和依赖装好你就能直接复制运行。先建技能文件夹路径按你的 Agent 框架来OpenClaw 默认在 workspace 下的 skills 目录mkdir -p /root/.openclaw/workspace/skills/scrapling cd /root/.openclaw/workspace/skills/scrapling然后装 Scrapling。建议用虚拟环境避免污染系统 Pythonpython3 -m venv venv source venv/bin/activate pip install scrapling[fetchers] -i https://pypi.tuna.tsinghua.edu.cn/simple装完验证一下版本python -c import scrapling; print(scrapling.__version__)能打印版本号就说明装好了。如果报缺少浏览器依赖执行scrapling install补装。接下来写 SKILL.md这是技能的身份证Agent 靠它判断什么时候调用这个技能。内容如下# 爬虫技能 ## 触发条件 - 用户说爬取XX网站 - 用户说抓取XX数据 - 用户说去XX官网搜索 - 用户说帮我看看XX页面内容 ## 能力 调用 fetch.py 抓取指定 URL 的网页内容返回 HTML 或文本。 ## 用法 python fetch.py url --max-length 5000这个文件不用写太复杂关键是触发条件要覆盖用户可能说的自然语言。Agent 匹配到关键词后就会把 URL 传给 fetch.py。然后是 fetch.py这是真正干活的脚本。它优先用 Scrapling失败则降级到 requests保证成功率#!/usr/bin/env python3 网页爬取小脚本 优先使用 Scrapling失败则用 requests 作为备选 https://github.com/D4Vinci/Scrapling import json import argparse import warnings warnings.filterwarnings(ignore) def fetch_with_scrapling(url, max_length5000): 使用 Scrapling 爬取网页 from scrapling import Fetcher session Fetcher() response session.get(url, verifyFalse, timeout30) if response.status 200: # 关键用 html_content 而不是 text content response.html_content truncated content[:max_length] return { status: success, url: url, status_code: response.status, content_length: len(content), content: truncated, truncated: len(content) max_length, method: scrapling } return None def fetch_with_requests(url, max_length5000): 备选方案requests import requests headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } response requests.get(url, headersheaders, verifyFalse, timeout30) return { status: success, url: url, status_code: response.status_code, content_length: len(response.text), content: response.text[:max_length], truncated: len(response.text) max_length, method: requests } def main(): parser argparse.ArgumentParser() parser.add_argument(url) parser.add_argument(--max-length, typeint, default5000) args parser.parse_args() # 先尝试 Scrapling失败则用 requests result fetch_with_scrapling(args.url, args.max_length) if not result or result.get(content_length, 0) 0: result fetch_with_requests(args.url, args.max_length) print(json.dumps(result, indent2, ensure_asciiFalse)) if __name__ __main__: main()给脚本加执行权限chmod x fetch.py这里有个坑要提前说Scrapling 的响应对象里取 HTML 内容要用html_content不是text。用错了会拿到空字符串然后误判为抓取失败。这是我在调试时踩过的坑脚本里已经写对了你复制时别改。如果你用的是 Cline MCP 或 Claude Code 这类工具配置思路一样只是技能注册方式不同。Cline MCP 需要在 MCP 配置里注册这个脚本为工具Claude Code 则通过 settings 文件挂载。无论哪种三件套必须写全Base URL 用https://taotoken.net/apiKey 用你的 TaoToken KeyModel ID 用你选的模型。缺一个都会在解析环节报错。配置片段示例以 settings 风格为例{ mcpServers: { scrapling-fetch: { command: python, args: [/root/.openclaw/workspace/skills/scrapling/fetch.py], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_MODEL: 你的模型ID } } } }路径和原文保持一致别写相对路径Agent 调用时工作目录可能不是你预期的位置。4. 实测验证抓取成功率与字段完整性配置写完必须实测。先单独跑脚本确认 Scrapling 能拿到内容cd /root/.openclaw/workspace/skills/scrapling source venv/bin/activate python fetch.py https://stockpage.10jqka.com.cn/600392/ --max-length 8000返回结果类似{ status: success, url: https://stockpage.10jqka.com.cn/600392/, status_code: 200, content_length: 74781, content: !DOCTYPE html..., truncated: true, method: scrapling }看到status: success和content_length是几万字节说明抓取成功。method字段显示用的是 scrapling 还是 requests如果显示 requests说明 Scrapling 那一步失败了需要看是不是依赖没装全。74781 字节的完整 HTML3 秒内返回这个速度对单页抓取完全够用。再验证字段完整性。抓到的 HTML 里应该包含页面标题、股票名称、当前价格这些关键信息。用 grep 快速检查python fetch.py https://stockpage.10jqka.com.cn/600392/ --max-length 200000 /tmp/page.json python -c import json d json.load(open(/tmp/page.json)) html d[content] for kw in [盛和资源, 600392, price, title]: print(kw, kw in html) 如果几个关键词都返回 True说明关键字段都在 HTML 里没有因为反爬被替换成空壳。这一步很重要有些站点会返回 200 但内容是验证页content_length看着正常实际没有数据。关键词检查能帮你识别这种情况。然后测 Agent 端到端。对小龙虾助手说帮我抓取 https://stockpage.10jqka.com.cn/600392/ 这个页面然后提取股票名称和当前价格助手应该会识别触发条件 → 调用 fetch.py → 拿到 HTML → 调 TaoToken 通道的模型做解析 → 返回结构化结果。如果它直接说我无法访问网页说明 SKILL.md 的触发条件没匹配上检查关键词有没有写全。如果它调用了脚本但解析失败检查 TaoToken 的 Key 和 Base URL 有没有配进技能环境变量。实测下来单站点连续抓 20 次成功率在 95% 以上。失败的几次是目标站点偶发 502重试一次就过了。这个成功率对大多数采集场景够用。如果你要抓的站点反爬更严可以在 fetch.py 里加retries3参数Scrapling 支持自动重试。多站点对比测试也做一下。同时抓三个不同域名的页面看 Scrapling 的通用性for url in https://stockpage.10jqka.com.cn/600392/ https://www.example.com/ https://www.python.org/; do echo $url python fetch.py $url --max-length 2000 | python -c import json,sys; djson.load(sys.stdin); print(d[status], d[content_length], d[method]) done三个都返回 success 且 method 为 scrapling说明库的通用抓取能力没问题。如果某个站点返回 requests说明 Scrapling 对该站点的指纹伪装没生效可以针对性调 Fetcher 的参数比如加impersonatechrome。5. 常见报错排查401、local proxy failed、reading choices配置过程中最容易撞的几个报错我按实际遇到的频率排一下对照着查。401 Unauthorized。这个几乎都是 Key 的问题。先确认环境变量有没有生效echo $TAOTOKEN_API_KEY如果输出为空说明source ~/.bashrc没执行或者你写到了别的 shell 配置文件里。如果输出有值但请求还是 401检查 Key 有没有多余空格或换行复制时容易带上。还有一种情况是 Key 被禁用或额度用完去控制台 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 看一下状态。local proxy failed。这个报错通常出现在请求发不出去的时候。检查服务器能不能正常访问外网curl -I https://taotoken.net/api如果 curl 也失败是网络层问题不是脚本问题。如果 curl 成功但脚本报 local proxy failed检查脚本里有没有误设HTTP_PROXY或HTTPS_PROXY环境变量。有些云服务器镜像会预置代理配置清掉即可unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxyreading choices 相关报错。这个一般出现在模型返回格式不符合预期时比如你期望 JSON 但模型返回了带 markdown 代码块的文本。解决方式是在解析提示词里明确要求只返回 JSON不要加代码块标记或者在脚本里做容错解析先 strip 掉json 和再 json.loads。如果报错信息里带choices字段为空说明模型请求本身失败了回到 401 那条排查 Key 和 Base URL。OAuth 相关报错。如果你用的是 Claude Code 或类似工具可能会遇到 OAuth token 过期。这类工具如果走 TaoToken 通道应该用 API Key 模式而不是 OAuth 模式。检查配置文件里是不是混用了两种认证方式统一改成 Bearer Token。Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有 Anthropic 兼容格式的配置说明。Scrapling 抓取返回空内容。先确认用的是html_content不是text。如果确认了还是空可能是目标站点需要 JS 渲染试试 Scrapling 的StealthyFetcherfrom scrapling import StealthyFetcher session StealthyFetcher() response session.get(url)StealthyFetcher 会启动无头浏览器能处理 JS 渲染页面但速度比 Fetcher 慢按需使用。Agent 不调用技能。检查 SKILL.md 的触发条件用户说的话里有没有匹配的关键词。如果用户说帮我看看这个页面而你的触发条件只写了爬取和抓取就匹配不上。把常见说法都加进去或者让 Agent 框架用语义匹配而不是关键词匹配。排查顺序建议先 curl 测通道 → 再单跑 fetch.py 测抓取 → 再测 Agent 端到端。哪一步失败就停在哪一步查不要跳步。6. 把爬虫技能用起来从单次抓取到定时任务技能装好只是起点真正省事的是把它变成自动化流程。最直接的用法是对助手说自然语言指令比如帮我抓取盛和资源页面然后提取资金流向数据。助手会走完整链路抓取 → 解析 → 返回结构化结果。你不需要记命令也不需要手动跑脚本。进阶玩法是配 Cron 做定时抓取。比如每个交易日收盘后自动抓取持仓股票数据crontab -e加一行30 15 * * 1-5 cd /root/.openclaw/workspace/skills/scrapling ./venv/bin/python fetch.py https://stockpage.10jqka.com.cn/600392/ --max-length 200000 /tmp/stock_$(date \%Y\%m\%d).json 21这样周一到周五 15:30 自动抓一次结果存到带日期的文件里。配合一个解析脚本就能做历史数据对比。多站点对比也很实用。写一个批量脚本同时抓多个竞品页面交给模型做差异分析#!/bin/bash for url in https://site-a.com/pricing https://site-b.com/pricing https://site-c.com/pricing; do echo $url python fetch.py $url --max-length 50000 done /tmp/compare.json然后把 compare.json 喂给助手让它提取各站点的价格字段做对比表。这就是AI 爬虫的组合价值爬虫负责拿原始数据模型负责理解和结构化。长期跑这类任务如果涉及大量模型调用可以看下 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。模型对话调试在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后提醒几个实操细节。请求频率一定要控制加time.sleep(2)在每次抓取之间别把目标站点打挂。抓到的数据如果含个人信息不要存储和传播。robots.txt 明确禁止的路径不要碰。技能脚本里的 Key 不要提交到 Git用环境变量或单独的 secrets 文件管理。这套配置跑通之后你的小龙虾助手就从只能聊天变成了能上网干活。抓取成功率、字段完整性、自动化调度都验证过了剩下的就是按你的业务场景去组合。遇到抓不动的站点先判断是技术问题还是权限问题技术问题调 Scrapling 参数权限问题就放弃别硬刚。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →