
leetcode-patterns 数据自动更新原理Python 定时抓取 LeetCode 公司题源与难度的完整机制【免费下载链接】leetcode-patternsA pattern-based approach to learn technical interview questions项目地址: https://gitcode.com/gh_mirrors/le/leetcode-patterns你是否好奇leetcode-patterns 题库里每道题的公司题源、难度、模式标签为什么总能保持最新答案藏在仓库的cron/目录里——一套由 Python 定时脚本 GitHub Actions 定时任务构成的数据自动更新管线周期性地向 LeetCode 的 GraphQL 接口发起抓取把公司面试高频统计、题目难度等元数据写回 src/data/questions.json再自动提交进仓库。一、数据自动更新的全链路概览整个管线可以拆成 5 步环环相扣步骤执行者做什么1️⃣ 定时触发GitHub Actions 定时任务每周固定时刻启动抓取流程2️⃣ 登录鉴权注入 3 个环境变量模拟已登录 LeetCode 的浏览器会话3️⃣ 逐题抓取cron/update_questions.py调用 GraphQL 接口获取每题元数据4️⃣ 解析清洗construct_company_tag_list()提取公司题源频次、难度、模式标签5️⃣ 写回提交脚本 Actions更新 src/data/questions.json 并自动 commit、push前端应用Next.js TanStack Table只负责读取这份 JSON 渲染表格完全不感知抓取细节——数据与展示彻底解耦这是它设计上的第一个亮点。二、定时触发一个每周日自动体检的 cron 任务定时入口定义在 .github/workflows/update-questions.ymlschedule: # Every Sunday at 8am EST (1pm UTC) - cron: 0 13 * * 0 每到周日 13:00UTC即美东时间 8:00GitHub Actions 就会自动拉起一次完整更新同时也保留了workflow_dispatch允许维护者随时手动触发。 为什么选每周一次公司题源统计来自真实面试反馈变化以周为单位低频抓取既保证数据新鲜又避免给 LeetCode 接口造成压力。2.1 三个通行证环境变量登录态是如何伪造的LeetCode 的公司题源接口只对已登录用户开放。工作流把仓库 Secrets 中的 3 个 token 注入到脚本环境环境变量作用LEETCODE_SESSION_TOKENLeetCode 登录会话凭证对应 CookieLEETCODE_SESSIONLEETCODE_CSRF_TOKEN跨站请求伪造防护令牌对应 Headerx-csrftokenLEETCODE_CF_CLEARANCECloudflare 人机验证通过凭证在 cron/update_questions.py 的create_leetcode_api()中这三个值会被打包进请求配置缺任意一个脚本都会直接报错退出——宁可失败也不带病运行。三、Python 抓取脚本GraphQL 请求是怎么发出去的3.1 只依赖标准库的轻量客户端项目并没有引入庞大的第三方 SDK而是在 cron/leetcode/ 下自建了一个极简客户端包cron/leetcode/models.py定义Configuration、ApiClient、DefaultApi等类真正发请求用的是 Python 标准库urllib.requestcron/leetcode/rest.py自定义ApiException异常统一处理 HTTP 错误码、原因和响应体请求时模拟了真实的 Chrome 浏览器User-Agent和Referer并把三个 token 拼成Cookie头——cron/leetcode/models.py 中的这段拼装逻辑是模拟登录态的关键。3.2 一次查询拿齐题目元数据脚本对题库里的每一道题按titleSlug向https://leetcode.com/graphql发起 POST 查询一次取回 6 类信息questionId / title题目编号与标题difficulty难度Easy / Medium / HardtopicTags模式标签如Array、Hash Table、BFScompanyTagStatsV2⭐ 公司题源统计 JSON 字符串isPaidOnly是否为 Premium 付费题四、公司题源解析为什么 Google 能排到 Amazon 前面抓取回来的companyTagStatsV2是一段 JSON按时间窗口分桶近 3 个月 / 3~6 个月 / 6 个月以上。cron/update_questions.py 中的construct_company_tag_list()只取近 6 个月内three_monthssix_months的记录按面试出现次数timesEncountered降序排列。以 src/data/questions.json 中的第一题Two Sum为例解析结果大致是Google225 次→ Amazon98 次→ Microsoft42 次→ Meta41 次→ Bloomberg23 次…… 这就是为什么前端表格里的公司图标和频次数字会活着变化——它们来自真实面试反馈的滚动统计而非人工维护。五、写回与自动提交数据如何回到仓库抓取结束后cron/update_questions.py 的write_questions()做两件事为每道题原地更新id、title、difficulty、pattern、companies、premium字段在文件顶层写入updated时间戳ISO 格式如2026-09-06T13:11:07方便你确认数据新鲜度。随后 Actions 以机器人身份执行git addcommit提交信息固定为chore: update question metadatapush且只有在文件确实有变化时才会产生一次提交。至此一次完整的抓取 → 清洗 → 写回 → 入库闭环结束 ✅六、想手动跑一次抓取三步搞定如果你想本地复现整个自动更新流程只需克隆仓库git clone https://gitcode.com/gh_mirrors/le/leetcode-patterns设置上面表格中的 3 个环境变量需要你自己登录 LeetCode 后从浏览器 Cookie 中提取在cron/目录下执行python update_questions.py脚本会打印每题的更新进度与总耗时最终覆盖 src/data/questions.json七、小结值得新手借鉴的 3 个设计点调度与逻辑分离GitHub Actions 只管何时跑Python 脚本只管怎么跑各自可独立维护️fail-fast 原则缺 token、空响应、IO 异常任何一步出问题立即退出并打印明确错误绝不留脏数据数据即文件抓取结果沉淀为一个纯 JSON 文件入库前端零配置即可消费天然支持版本追溯看懂了这条每周日悄悄运转的管线你就掌握了开源项目中数据定时同步的典型范式定时触发、登录态抓取、增量清洗、自动提交四步组合即可让任何静态数据长出自动更新的呼吸感。【免费下载链接】leetcode-patternsA pattern-based approach to learn technical interview questions项目地址: https://gitcode.com/gh_mirrors/le/leetcode-patterns创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考