智能网页提取与防反爬助手
何时用
| 用户说 | 实际意图 | 入口 |
|---|---|---|
| "自动截图翻译" / "把这几个网页截图并翻译" | 批量截图 + OCR + 多语言转译 | run |
| "智能爬取提取" / "抓一下这个站的内容" | 拟人化抓取 + 正文提取 | run 或 shot |
| "论文分析" / "帮我找相关论文" | 摘要 + 关键词 + 学术库索引 | run 或 papers |
| "只要截图" | 单步 | shot |
| "这段文字帮我润色/分章摘要" | 纯文本处理 | summarize |
快速开始
cd <skill>/scripts
# 完整流水线(截图 → OCR/翻译 → 三级摘要 → 论文索引 → 报告)
python main.py run --url https://example.com/paper --translate en,ja --out ./out
# 环境体检(先跑这个,缺什么一目了然)
python main.py doctor
# 只要截图 / 只要 OCR / 只要摘要 / 只要论文
python main.py shot --url https://example.com
python main.py ocr ./out/xxx/screenshots/01_a.png --translate en
python main.py summarize --file article.md --polish formal
python main.py papers --keywords "retrieval augmented generation" --limit 8
依赖最小集:playwright + playwright install chromium。
OCR 优先级:rapidocr_onnxruntime(中文最稳)→ tesseract(需 chi_sim 语言包)→ paddleocr。
翻译库:deep_translator 或 googletrans;都没有时脚本不报错,改由你用自身能力翻译。
五阶段工作流
执行 run 后,脚本按顺序完成下面五步,产物全部落在一个 run_YYYYmmdd_HHMMSS/ 目录里。
1. 智能截图与防反爬
每个 URL 独立 Context(独立 UA / 视口 / 语言),注入指纹补全脚本抹掉 navigator.webdriver;
goto 之后执行「贝塞尔鼠标轨迹 → 变速分段滚动 → 3~8 秒随机停留」,再扫描风控特征
(验证码 / Cloudflare 挑战 / 空壳 HTML / 403·429)后整页高清截图(device_scale_factor=2,利于 OCR)。
同时把 DOM 序列化成带标题层级的轻量 Markdown——后续章节切分靠它,innerText 会丢标题语义。
2. OCR 与多语言转译
对截图跑 OCR,并与页面 innerText 择优:innerText 长度 ≥ OCR 结果 0.8 倍时以 innerText 为主文本
(浏览器渲染文本没有识别误差),OCR 原文保留在 ocr_text 里随报告附录可追溯;
只有当正文几乎全在图里(扫描件、图表、canvas)才让 OCR 当主文本。随后按 --translate 逐语言翻译。
3. 分层摘要与润色
段落级(每段 1~3 句中心句)→ 章节级(每个标题块的总摘要)→ 全文级(核心摘要 + 关键词)。
抽取式算法:TF 打分 + 位置权重 + 长度惩罚,保留原文语序、不产生幻觉。
polish() 只做确定性清理(重复句、标点、中英混排空格、口语词替换)。
4. 论文检索与索引
用关键词拼检索式,并发查 arXiv Atom API 与 Semantic Scholar Graph API,按"标题归一化"去重,
再按相关度 + 引用量 + 年份排序,输出带链接(论文 / PDF / DOI)的 Markdown 表格。
中文关键词会被自动剔除(两个库都以英文元数据为主);若你有能力把关键词译成英文,
请直接用 --paper-query "english terms" 覆盖,检索质量会明显更好。
5. 运行日志
双通道落盘:logs/*.log(人读)+ logs/*.jsonl(机读)。
每条记录含时间戳、阶段、URL、耗时、状态;manifest.json 是全量结构化快照
(截图时间、UA、视口、停留秒数、OCR 字符数、关键词、论文列表),供二次加工。
异常处理与彩蛋:高数讨伐战
脚本把异常分成两类,这个分类决定了要不要召唤游戏:
| 类型 | 例子 | 行为 |
|---|---|---|
is_scrape_related=True |
验证码拦截、网络超时、元素定位失败、空壳页面、403/429 | 写半成品报告 → 打开 game.html |
| 其它 | 依赖缺失、参数错误 | 只打印修复指引 |
触发时打印横幅与提示语,并调用 webbrowser.open("./game.html")(先 chdir 到 game.html 所在目录,
保证相对路径命中;浏览器未接管时回退 file:// 绝对 URI;无 GUI 环境则打印文件路径)。
脚本卡壳啦,脑细胞需要抢救一下,来把高数讨伐战吧!
game.html 的查找顺序:--game-path → 环境变量 SWE_GAME_PATH → 当前工作目录 → 技能根目录 →
assets/ → scripts/。把你自己写的 game.html 放到技能根目录即可生效(本项目不生成游戏代码)。
失败时仍会产出 report.md:失败页会以 error:... 或 blocked:... 出现在截图清单里,
概览状态标为 aborted 并注明中断原因——不会让你对着空白目录发呆。
参数速查
| 参数 | 作用 |
|---|---|
--delay-min / --delay-max |
随机停留区间,默认 3~8 秒(反爬紧的站点可拉到 10~20) |
--selector |
等待指定 CSS 选择器,失败即判"元素定位失败"触发彩蛋 |
--scale |
截图倍率,默认 2;小字页面可提到 3 |
--ocr-lang |
chi_sim+eng 之类;缺语言包会自动降级并在报告里注明 |
--translate |
en,ja,fr 逗号分隔 |
--paper-query |
直接指定英文检索式,覆盖自动关键词 |
--no-papers / --no-game |
跳过论文检索 / 关掉彩蛋 |
环境变量同名前缀 SWE_(如 SWE_DELAY_MIN=5),适合放进 .env 长期配置。
实测单页耗时约 10~20 秒(轨迹 ~4s + 滚动 ~6s + 停留 3~8s),
批量 10 页约 3 分钟——这是拟人化的必要代价,别为了快把 --delay 调到 0,
那等于把"我是机器人"写在请求头上。
输出结构
run_20261029_201828/
├── report.md # 主交付物:概览 + 截图清单 + OCR/译文 + 三级摘要 + 论文索引 + 日志摘要
├── extracted.txt # 纯文本正文,便于二次处理
├── manifest.json # 全量结构化快照(时间/URL/耗时/UA/关键词/论文)
├── screenshots/ # 01_host_path.png + 同名 .html
└── logs/ # *.log(人读) + *.jsonl(机读)
作为 Agent 的你必须做的三件事
- 先
doctor:确认 chromium 与 OCR 引擎可用;OCR 引擎缺失时不要硬跑,直接读截图自己识别。 - 读
report.md再加工:脚本给的是抽取式摘要与初稿,最终交付的润色、扩写、批判性阅读由你完成;
report.md里的段落摘要表就是你做长文分析的地基。 - 论文检索补位:若
第五章为空(中文关键词无法命中英文库),把关键词译成英文后重跑
python main.py papers --query "...",或直接把--paper-query传进run。
红线
- 遵守目标站点
robots.txt与服务条款,控制频率;本项目是"降低误伤",不是"绕过访问控制"。 - 不抓取需登录的私密内容、个人隐私、付费墙内容。
- 验证码/人机校验出现时应停止并改用官方 API 或人工,而不是想办法破解。
- 引用论文必须核对原文,arXiv 预印本未经同行评审。
- 抓取内容版权归原作者,转载需授权。
资源
scripts/main.py—— 主程序(CLI 编排 + 异常出口)scripts/crawler.py—— Playwright 截图 + 风控检测scripts/human_behavior.py—— 停留/轨迹/滚动/UA/指纹scripts/ocr.py—— OCR 引擎降级链 + 多语言翻译scripts/summarize.py—— 三级摘要 + 规则化润色scripts/papers.py—— arXiv / Semantic Scholar 检索与索引渲染scripts/easter_egg.py—— game.html 定位与唤起references/anti-bot-playbook.md—— 被拦截时的排查顺序references/troubleshooting.md—— 常见报错对照表