GitPrey 源码架构剖析:一个单文件爬虫工具的代码设计与实现思路

📅 2026/8/27 15:37:23
GitPrey 源码架构剖析:一个单文件爬虫工具的代码设计与实现思路
GitPrey 源码架构剖析一个单文件爬虫工具的代码设计与实现思路【免费下载链接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words项目地址: https://gitcode.com/gh_mirrors/gi/GitPreyGitPrey 是一个基于关键词的 GitHub 敏感信息扫描工具它能按企业名或指定关键词搜索代码库找出其中泄露的敏感文件与敏感代码内容。整个扫描器的核心逻辑只写在约 284 行的 GitPrey.py 单文件中堪称单文件爬虫的极简范本。本文带你剖析它的源码架构三阶段扫描流水线如何搭建、为什么放弃官方 API 改爬网页、外部化模式库又是如何设计的。 项目速览一个文件撑起整个扫描器GitPrey 的工作目标很明确输入一个关键词比如公司名输出所有可能泄露敏感信息的仓库、文件和代码行。它的技术选型非常克制只依赖 4 个第三方库依赖用途requests发送 HTTP 请求、模拟登录BeautifulSoup解析搜索结果网页lxml提供 HTML 解析引擎colorama终端彩色输出全部核心逻辑登录、检索、解析、过滤、输出集中在GitPrey.py的GitPrey类中第 44 行起这也是理解整个架构的关键入口。 目录结构核心逻辑只在一个文件里项目目录小而清晰每个文件职责单一GitPrey/ ├── GitPrey.py # 主程序扫描器核心逻辑单文件 ├── config/ # 配置包用户在此放入自己的 Config.py ├── include/ │ └── ColorPrint.py # 彩色打印 文件日志模块 └── pattern/ ├── path.db # 敏感文件名列表如 htpasswd、netrc ├── file.db # 内容搜索的文件范围如 config、secret └── info.db # 敏感内容关键词如 password、pwd几个值得注意的设计config/目录出厂只带一个空的__init__.py用户需要自行创建Config.py填入 GitHub 账号密码。这样设计避免了示例配置被误提交也降低了主程序对具体配置的耦合。pattern/目录把扫描什么从怎么扫描中剥离后面会详细讲这种数据与逻辑分离的好处。⚙️ 三阶段扫描流水线核心架构GitPrey 的整体架构是一条三段式流水线每一段的输出都是下一段的输入关键词项目检索→敏感文件名扫描→敏感内容扫描第一阶段按关键词圈定疑似项目入口是GitPrey类的search_project()方法GitPrey.py第 66 行。它构造的搜索查询是{keyword} in:file,path即代码内容或文件路径中出现该关键词。这里有两个精巧的细节去重每页结果先经set()去重累加进unique_project_list迭代排除找到一批仓库后把它们拼成-repo:xxx -repo:yyy追加到查询里再查第一页——因为已发现的仓库被排除第一页永远是新鲜结果这样巧妙地绕开了 GitHub单次搜索最多 1000 条的硬性上限。第二阶段敏感文件名扫描project_miner()函数第 255 行把第一阶段找到的所有仓库拼成repo:xxx repo:yyy ...字符串再交给sensitive_info_query()第 101 行。filename 模式下程序读取pattern/path.db中的 41 个敏感文件名如htpasswd、netrc、bash_history、private.key拼成filename:xxx filename:yyy与仓库条件做隐式 AND 组合让 GitHub 只在这些仓库里找这些高危文件。第三阶段敏感内容扫描与逐行正则过滤content 模式的流程更精细在__file_content_inspect()方法第 122 行中从pattern/info.db读取敏感词password、pwd、private_key 等由于 GitHub 单次搜索的 OR 操作符最多 5 个程序用math.floor(len/5)1做分批轮询每 5 个词查一轮命中文件后把页面链接的 host 从 GitHub 换成 raw 地址第 134 行的replace(HOST_NAME, RAW_NAME)直接拉取原始文件内容在本地对每一行做正则匹配re.search忽略大小写只输出真正包含敏感词的那几行代码。服务端粗筛 客户端精筛的组合既省流量又提高了准确率。 关键设计决策剖析为什么放弃官方 API选择爬网页这是全文最值得学习的一个决策README 里给出了两个量化理由代码搜索 API 认证后限流30 次/分钟根本跑不完批量扫描API 单页最多返回100 条而网页端可达1000 条总召回量差一个数量级。所以当 API 能力不匹配场景时退而求其次地爬 Web 页面反而是更工程化的选择。自动登录绕开 429 限制未登录状态下快速翻页约 10 页就会触发429 Too Many Requests。__auto_login()方法第 192 行模拟浏览器完成登录先 GET 登录页收集全部隐藏表单字段再带上账号密码 POST并把 session cookies 交给后续所有请求。登录失败会直接报错退出而不是带着半残的会话继续跑。此外__get_page_html()第 207 行对 429 状态码有兜底休眠后重试连接错误给出明确提示读超时返回空串让上层自然跳过。防御性编程贯穿始终。五级扫描深度速度与召回的权衡第 38 行的一行常量定义了全部深度策略SCAN_DEEP [10, 30, 50, 70, 100]Level 1 到 Level 5 对应检索最近索引的前 10~100 页代码结果这个数字同时复用为请求超时秒数——一个配置项承担两个职责简单但实用。官方建议扫描深度与扫描周期正相关Level 1 适合每天扫Level 5 可放宽周期。️ 外部化模式库三个 pattern 文件的分工GitPrey 把扫什么完全交给pattern/目录下的三个纯文本文件每行一个条目文件作用示例条目pattern/path.db敏感文件名扫描第二阶段htpasswd、netrc、pgpasspattern/file.db限定内容搜索的文件范围config、credential、secretpattern/info.db敏感内容关键词第三阶段password、pwd、user读取逻辑只有 8 行——__pattern_db_list()方法第 173 行逐行读入即可。这意味着普通用户不改一行代码就能扩展扫描规则往path.db里加一行myservice.conf下次扫描就多盯一个文件。这是配置即数据最直观的收益。 辅助模块ColorPrint 与命令行入口include/ColorPrint.py把怎么显示从主逻辑中拆了出来提供 5 个语义化函数error_print红色——错误info_print绿色——进度信息project_print青色——项目信息file_print黄色——命中文件code_print白色——命中代码行更妙的是第 16~20 行模块初始化时挂了一个FileHandler所有打印同步落盘到 GitPrey.log。终端看着是彩色进度条实际已是一份完整审计日志几乎零成本实现了所见即所记。命令行入口init()函数第 229 行用 argparse 只暴露两个参数-l搜索深度1~5、-k关键词必填并用正则做关键词合法性校验——配置项从配置文件挪到命令行正是 v2.2 版本的一次重要简化。 新手可借鉴的 4 个设计思路单文件不等于单职责糊在一起一个文件里仍按检索 → 扫描 → 输出严格分层方法命名search_project/sensitive_info_query自解释数据与逻辑分离扫描规则放在.db文本文件扩展规则零代码改动展示与业务分离换一套输出风格只需替换 ColorPrint 模块防御性兜底缺依赖友好报错、429 重试、登录失败快速退出每一步异常都有归宿。也要理解它的边界README 中坦诚列出GitHub 只索引默认分支、单次搜索上限 1000 条、仅检索 384KB 以下的文件——因此结果可能存在漏报关键词未进路径/内容或误报第三方仓库恰好引用了关键词把它当作线索发现器而非审计终审工具才符合定位。 获取并运行 GitPreygit clone https://gitcode.com/gh_mirrors/gi/GitPrey cd GitPrey pip install requests beautifulsoup4 lxml colorama随后在config/下创建Config.py填入 GitHub 账号登录态是规避 429 的前提即可运行python GitPrey.py -k 你的关键词 -l 1从进度条到彩色报告你会看到三阶段流水线依次执行——而这背后全部架构就藏在那个不到 300 行的文件里。总结GitPrey 的架构魅力在于用最小代码量解决了一个多阶段问题单文件承载检索、解析、过滤全链路pattern 库承载扫描规则ColorPrint 承载展示。它给新手的核心启示是——架构清晰不取决于文件数量而取决于职责边界是否干净。读懂这一个文件你就读懂了爬虫类工具最常见的骨架登录态维护、分页检索、HTML 解析、本地精筛与结果落盘。【免费下载链接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words项目地址: https://gitcode.com/gh_mirrors/gi/GitPrey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考