ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

用 Codex 创建论文全文下载 Skill:Playwright 抓取 IEEE Xplore 与 Springer Nature Link 的配置骨架

用 Codex 创建论文全文下载 Skill:Playwright 抓取 IEEE Xplore 与 Springer Nature Link 的配置骨架 1. 为什么要把论文下载做成 Codex Skill如果你经常读论文一定经历过这套动作打开 IEEE Xplore 或 Springer Nature Link 的文章页点机构登录搜学校名跳统一身份认证输账号过 MFA回到出版商站点再点 PDF 保存。单次操作不复杂但它会被反复执行几十上百次而且两个站点的 URL 结构、登录入口、PDF 路由、会话机制完全不同。用普通脚本硬写最后往往退化成一堆一次性选择器页面一改就全废。Codex 的 Skill 机制刚好适合这种场景。它能把「什么时候触发、按什么流程走、哪些事绝对不能做、出错怎么停」一起封装成可复用组件再用 Playwright 把容易出错的浏览器步骤固化成确定性代码。最终体验可以压缩成一句话使用 $ieee-download-paper 下载 https://ieeexplore.ieee.org/document/11158579或者使用 $springer-download-paper 下载 https://link.springer.com/article/10.1007/s10515-026-00637-6。这篇面向想自己搭一套科研自动化流程的人重点给可复制的目录结构、config.toml 与 settings.json 骨架、TaoToken 统一 Key/API 通道接入方式以及一次本地运行验证和失败重试检查点。适合有基础 Node.js 经验、想用 Codex Playwright 做论文抓取骨架的读者。2. TaoToken 前置统一 Key 与 API 通道在写 Skill 之前先把模型调用通道固定下来。Codex 在执行 Skill 时经常需要模型做输入规范化、标题抽取、相关性判断如果每个脚本各自读环境变量、各自拼 endpoint后期维护会很乱。我的做法是统一走 TaoToken 的 API 通道一个 Key 覆盖对话与编码类模型脚本里只读一个配置项。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址https://taotoken.net/api这个地址不加 UTM你需要先在控制台创建一个 Key然后把它写进 Skill 的本地配置而不是硬编码进脚本。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentKey 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content注意Key 只放在本地 config.toml 或环境变量里不要提交到 Git也不要写进 SKILL.md 正文。持久化浏览器目录里的 Cookie 同理属于敏感数据。如果你的 Skill 只是纯 Playwright 抓取、不调用模型可以跳过这一步但只要涉及「读摘要判断相关性」「把标题规范化成文件名」这类动作统一通道会省掉大量重复配置。长期跑编码类 Agent 任务的话可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content3. 可复制配置目录结构与两个配置文件两个 Skill 采用同一套结构Skill 指令 Playwright 脚本 独立浏览器配置。目录长这样$CODEX_HOME/skills/ ├── ieee-download-paper/ │ ├── SKILL.md │ ├── config.toml │ ├── settings.json │ ├── package.json │ ├── agents/ │ │ └── openai.yaml │ └── scripts/ │ └── ieee-download.mjs └── springer-download-paper/ ├── SKILL.md ├── config.toml ├── settings.json ├── package.json ├── agents/ │ └── openai.yaml └── scripts/ └── springer-download.mjs先初始化 SkillCodex 自带 skill-creatorpython $CODEX_HOME\skills\.system\skill-creator\scripts\init_skill.py \ ieee-download-paper \ --path $CODEX_HOME\skills \ --resources scripts \ --interface display_nameIEEE Paper Downloader \ --interface short_descriptionDownload IEEE papers through institutional access \ --interface default_promptUse $ieee-download-paper to download an IEEE paper.依赖保持最小化只装 playwright-core直接驱动本机 Edge不额外下载 Chromium{ name: paper-download-skill, private: true, type: module, dependencies: { playwright-core: 1.61.1 } }npm install --omitdev --prefix $SKILL_DIRconfig.toml 放模型通道和运行参数settings.json 放浏览器与下载行为。两个文件都只放非敏感默认值Key 用环境变量占位# config.toml [model] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY chat_model gpt-4o-mini [download] output_dir D:/papers max_fulltext_per_run 5 request_timeout_ms 30000 poll_interval_ms 4000 poll_max_attempts 15 [security] allow_domains [ieeexplore.ieee.org, link.springer.com, wayf.springernature.com] save_credentials false bypass_captcha false{ browser: { channel: msedge, headless: false, acceptDownloads: true, viewport: null, locale: en-US }, profile: { dir_name: edge-profile, reuse_session: true }, download: { filename_mode: citation_title, conflict_policy: timestamp, verify_pdf_header: true, min_pdf_bytes: 1024 }, retry: { on_session_expired: true, on_204: true, on_robot_check: false } }on_robot_check false是刻意设的遇到机器人检测直接停不重试、不绕过。max_fulltext_per_run 5是硬上限候选超过 5 篇时先输出清单让用户二次筛选不要自动继续下一批。4. 脚本骨架输入规范化与持久化会话SKILL.md 的 frontmatter 决定 Skill 能否被正确触发description 要写清触发条件--- name: ieee-download-paper description: Download IEEE Xplore article PDFs by using the users legitimate institutional subscription in a persistent Microsoft Edge session. Use when the user provides an IEEE document URL, document number, or DOI and asks to save the full-text PDF. ---正文里把操作约束写死允许哪些输入、执行哪个脚本、PDF 存哪、登录时怎么和用户协作、什么算成功、什么情况必须停。安全规则也写进 Skill而不是靠记忆只用用户本来就有的机构权限不保存或传递账号密码MFA 和 CAPTCHA 必须由用户在可见页面完成不绕过付费墙和频率限制持久化目录含 Cookie不得上传或提交 Git。输入规范化让 Skill 更好用IEEE 版本同时接受文档号、URL 和 DOIfunction normalizeInput(input) { const value input.trim(); if (/^\d{6,12}$/.test(value)) { return https://ieeexplore.ieee.org/document/${value}; } if (/^10\.\d{4,9}\//i.test(value)) { return https://doi.org/${value}; } return new URL(value).toString(); }Springer 版本把 DOI 规范化为文章页if (/^10\.1007\//i.test(value)) { return https://link.springer.com/article/${value}; }持久化会话是整套方案的关键。如果每次启动都是全新浏览器用户就得反复选机构、反复登录。用launchPersistentContext把 Cookie 和本地存储保存在独立目录const context await chromium.launchPersistentContext(profileDir, { channel: msedge, headless: false, acceptDownloads: true, viewport: null, locale: en-US, });两个要点headless: false机构登录、MFA、验证码必须在可见浏览器里完成profileDir必须是专用目录绝不能让脚本操作用户日常的 Edge 主配置。const profileDir path.join( process.env.LOCALAPPDATA, Codex, ieee-download-paper, edge-profile );这个目录等价于登录凭证容器按敏感数据处理。5. 验证请求与成功结果IEEE 论文通常由 arnumber 唯一标识。脚本先从文章 URL、查询参数、canonical 链接或页面正文提取文档号再通过浏览器上下文请求官方 PDF 路由。核心校验不是 HTTP 200而是返回内容必须真的是 PDFconst body await response.body(); if ( body.length 1024 body.subarray(0, 5).toString(ascii) %PDF- ) { return body; }原因很直接很多站点未登录时仍返回 200但正文其实是登录页、错误页或机器人验证页。只看状态码就会把 HTML 错误页存成 .pdf。没有权限时脚本点击机构登录入口、搜索学校然后等用户在 SSO 页面完成认证。脚本每隔数秒重新请求 PDFCookie 一生效下载自动继续。Springer 的官方 PDF 路由可以由 DOI 构造function pdfUrlFor(doi) { const encoded doi.split(/).map(encodeURIComponent).join(/); return https://link.springer.com/content/pdf/${encoded}.pdf; }未订阅时目标示例返回 204文章页显示 Log in via an institution。脚本点击后进入 Springer WAYF 页面机构搜索框名称为 searchconst input wayf.locator(input[namesearch]).first(); await input.fill(institution); await input.press(Enter);本地实测结果IEEE 文档号 11158579输出 514,818 字节文件头%PDF-Springer DOI 10.1007/s10515-026-00637-6输出 3,855,558 字节40 页文件头%PDF-。文件名优先从标准元数据读取const title await page .locator(meta[namecitation_title]) .first() .getAttribute(content);Windows 非法字符要替换写文件用wx避免静默覆盖已存在就追加时间戳function safeFilename(value) { return value .replace(/[:/\\|?*\u0000-\u001f]/g, _) .replace(/\s/g, ) .trim() .slice(0, 180); }创建完成后至少跑四层验证结构校验quick_validate.py、语法校验node --check、依赖审计npm audit --omitdev、真实文章全链路测试。测试时记录文件是否存在、大小是否合理、前 5 字节是否为%PDF-、解析器能否读出页数、浏览器是否正确关闭并释放持久化配置。6. 本篇常见错排查返回 200 但保存的是 HTML。最常见。只判断状态码就会中招必须校验%PDF-文件头和最小字节数。把verify_pdf_header保持为 true。会话过期后一直卡在登录页。持久化目录里的 Cookie 失效了。检查retry.on_session_expired让脚本重新走机构登录入口而不是无限轮询 PDF 路由。Springer 返回 204。说明当前会话没有订阅权限属于正常分支应触发机构登录流程而不是当成错误重试。机构搜索框填不进去。WAYF 页面输入框名称是search用input[namesearch]定位如果页面结构变了先打印 DOM 再改选择器不要盲猜。遇到机器人检测循环。比如 ScienceDirect 会持续进入检查循环勾选后再次发起检查。这不是换选择器能解决的属于网站综合自动化特征、网络出口、浏览器环境和行为风险做的判断。继续自动点击属于规避机器人检测正确做法是明确停止自动化、删除不可靠的 Skill、改用普通浏览器手动下载。on_robot_check false就是为这个场景准备的。下载数量触发限流。检索结果可能几十上百篇但不要把「找到多少」变成「下载多少」。单次全文下载不超过 5 篇超过就先输出题目、摘要、相关性和链接让用户二次筛选不要并发、切换会话或缩短间隔去规避限制。Key 或 Cookie 泄露风险。config.toml 里用api_key_env占位真实 Key 走环境变量持久化目录加进 .gitignore。这两条写进 SKILL.md 的安全规则里。7. 接入方式与后续动作把模型通道固定成统一入口后Skill 脚本只需要读TAOTOKEN_API_KEY和base_url不用为每个脚本单独配 endpoint。需要新建或轮换 Key 时走 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入参数和字段说明看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content想先验证模型返回是否符合预期用模型对话页试一条https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content如果这套 Skill 要长期跑检索、筛选、全文归纳的编码类 Agent 流程Coding Plan 更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content后续可以继续增强的方向把出版商差异抽象成统一适配器接口下载前自动识别开放获取状态把 DOI、题目、作者、本地路径写入统一文献清单与本地知识库联动为机构登录状态加更清晰的过期检测加入保守速率限制和可审计日志。真正可靠的 Agent 不是「任何网站都能下载」而是每一步都可解释、可验证并且知道什么时候该把控制权交还给用户。
返回列表