☰
突破反爬!给小龙虾添加爬虫技能,TaoToken 让 AI 秒变数据高手
2026/10/1 7:03:43 网站建设 项目流程

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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数,配置的时候直接用这个干净地址。你需要先去控制台创建一个 API Key,控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,Key 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

创建 Key 的流程不复杂:登录后进控制台,找到 API Keys 页面,点新建,复制生成的 Key。这个 Key 只显示一次,复制后存到安全的地方。然后确认你要用的模型 ID,比如做代码解析和结构化提取,选一个指令跟随能力强的模型就行。模型对话页面在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,可以先在那里试一下模型能不能正常返回,确认通道通了再写进脚本。

为什么要在爬虫技能里接 TaoToken,而不是让助手直接用内置模型?因为技能脚本是独立进程,它需要自己发模型请求来做内容解析。把 Base URL 和 Key 统一成 TaoToken 的,脚本里只需要读两个环境变量,换模型时改一个 Model ID 就行,不用动代码。这对后面做定时任务和多站点对比特别重要。

配置方式有两种。一种是在服务器上写环境变量,适合长期运行;另一种是写进技能的配置文件,适合快速测试。我建议用环境变量,因为技能脚本被 Agent 调用时,环境变量会自动继承,不用在代码里硬编码密钥。具体操作是在~/.bashrc或 systemd 服务文件里加:

export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_BASE_URL="https://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_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= ,配置细节以文档为准。

3. 可复制的 Scrapling 技能配置与抓取脚本

这一节是核心,把技能目录、SKILL.md、fetch.py 和依赖装好,你就能直接复制运行。先建技能文件夹,路径按你的 Agent 框架来,OpenClaw 默认在 workspace 下的 skills 目录:

mkdir -p /root/.openclaw/workspace/skills/scrapling cd /root/.openclaw/workspace/skills/scrapling

然后装 Scrapling。建议用虚拟环境,避免污染系统 Python:

python3 -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_length=5000): """使用 Scrapling 爬取网页""" from scrapling import Fetcher session = Fetcher() response = session.get(url, verify=False, timeout=30) 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_length=5000): """备选方案: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, headers=headers, verify=False, timeout=30) 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', type=int, default=5000) 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, indent=2, ensure_ascii=False)) 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/api,Key 用你的 TaoToken Key,Model 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 字节的完整 HTML,3 秒内返回,这个速度对单页抓取完全够用。

再验证字段完整性。抓到的 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 里加retries=3参数,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; d=json.load(sys.stdin); print(d['status'], d['content_length'], d['method'])" done

三个都返回 success 且 method 为 scrapling,说明库的通用抓取能力没问题。如果某个站点返回 requests,说明 Scrapling 对该站点的指纹伪装没生效,可以针对性调 Fetcher 的参数,比如加impersonate="chrome"。

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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_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_proxy

reading 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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有 Anthropic 兼容格式的配置说明。

Scrapling 抓取返回空内容。先确认用的是html_content不是text。如果确认了还是空,可能是目标站点需要 JS 渲染,试试 Scrapling 的StealthyFetcher:

from 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 2>&1

这样周一到周五 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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。模型对话调试在 https://taotoken.net/models?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= 。

最后提醒几个实操细节。请求频率一定要控制,加time.sleep(2)在每次抓取之间,别把目标站点打挂。抓到的数据如果含个人信息,不要存储和传播。robots.txt 明确禁止的路径不要碰。技能脚本里的 Key 不要提交到 Git,用环境变量或单独的 secrets 文件管理。

这套配置跑通之后,你的小龙虾助手就从"只能聊天"变成了"能上网干活"。抓取成功率、字段完整性、自动化调度都验证过了,剩下的就是按你的业务场景去组合。遇到抓不动的站点,先判断是技术问题还是权限问题,技术问题调 Scrapling 参数,权限问题就放弃,别硬刚。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询