Pixiano/dapro-scraper-2026

GitHub: Pixiano/dapro-scraper-2026

一款完全本地运行的实体研究聚合工具,通过多平台抓取结合本地视觉模型和推理 LLM,自动生成带来源引用和置信度标注的结构化研究档案。

Stars: 1 | Forks: 0

# 🕵️ 实体研究聚合器 [![tests](https://static.pigsec.cn/wp-content/uploads/repos/cas/6b/6b52945adbf8d9e421fe243515ae54cfbd3da263f16b1eabda37cdc0b797b8eb.svg)](https://github.com/Pixiano/dapro-scraper-2026/actions/workflows/tests.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) ![Python 3.13](https://img.shields.io/badge/python-3.13-blue.svg) **TL;DR:** 一款本地优先的研究工具。只需提供某个 YouTuber/创作者/公司在 15+ 个平台上的链接,它就会使用专门构建的收集器抓取各个平台,在本地视觉模型上分析每张截图,并利用本地推理 LLM 将所有信息综合成一份有据可查的 Markdown/PDF 档案——每一个推断出的论断都附有置信度级别和引用来源。技术栈包括 Python/FastAPI 后端、异步任务队列、SQLite、Playwright、llama.cpp。包含 214 个测试,完全离线。除了实际的抓取请求和免费的 YouTube API 外,不会有任何数据离开你的机器。 我粘贴一堆链接——他们的网站、YouTube、Instagram、GitHub、Patreon,还有那个他们肯定忘了更新的 Linktree——然后这东西就会把它们全抓取下来,用**本地视觉模型**审视每一张截图,把这一大堆数据交给**本地 LLM**,最后还给我一份 Markdown(或者 PDF,我现在讲究起来了)研究报告。里面甚至包含一个实打实的“他们可能是怎么赚钱的”部分,而且像成熟的成年人一样,每个推断都标明了信息来源。 所有操作都**在我自己的机器上**运行。除了我让它去查看的真实网站的实际 HTTP 请求,以及(可选的、免费的、有配额限制的)YouTube Data API 外,没有任何数据会离开我的 PC。思考的过程由我的 GPU 完成。我的 GPU 也会累,所以我尽量对它好点。 没错,这篇 README 里面有些段子。但也同样有真正的文档。它散发着一种“一口气写完一整个应用,现在还有点小亢奋”的气息,说实话?我不抱歉。 ## 截图 **录入表单。** 粘贴链接,即可获得每个链接的即时平台自动检测。 ![空的录入表单](https://static.pigsec.cn/wp-content/uploads/repos/cas/89/8938225ceac8f21d4a5618d64f8081fba69974063026ec0175e13517a8a37d37.png) **填入链接后——徽章会自动检测每个 URL 对应的平台**(网站 / YouTube / GitHub / LinkedIn 等),这样我一眼就能看出每个链接将运行哪个收集器。 ![填入链接并显示平台徽章的录入表单](https://static.pigsec.cn/wp-content/uploads/repos/cas/d2/d23e7b26dfc9df3626e79b8990644791f15fa5dfd0cf1ebd0e54b696ca6ea8d6.png) **一份真实生成的档案**——这来自于一次真实的 15 个来源抓取,全部关于 NASA。 ![生成档案的顶部,显示了标题和概述部分](https://static.pigsec.cn/wp-content/uploads/repos/cas/d8/d854349897ea3de740bdf2e1b43ce4cb240582199f9882b47e9450e030ff0f9d.png) **“推断见解”部分**——这才是整个项目的真正意义所在。每一个论断都标有置信度级别,并附有来自真实来源的引用。没有证据的推断绝不放入其中。 ![带有置信度标签和来源引用论断的推断见解部分](https://static.pigsec.cn/wp-content/uploads/repos/cas/78/785723b2c5afd20ff107af5fdc7cb36cc5e79ab3e312600fa042e358b01ce8b3.png) **每个产物都是可检查的**——原始提取的文本以及本地视觉模型对每张截图的真实解读,包括它对 404 页面那段极其有趣的描述。 ![展开的来源卡片,显示提取的文本和描述 404 页面的视觉模型备注](https://static.pigsec.cn/wp-content/uploads/repos/cas/ed/ed10dd5499e02c5af38e32d50a39ff44484d7e354b63001ba7fc40ad8f890663.png) ## 展现的技能 这部分主要是写给那些关心“这能证明我具备什么能力”的人——招聘人员、未来的我、或者其他什么人: - **后端架构:** FastAPI,采用单 worker 队列的异步任务编排(这是刻意设计的——一个 GPU 同一时间只驻留一个模型),SQLite 用于任务状态/缓存/配额跟踪。 - **LLM 集成与 prompt engineering:** 通过 llama.cpp 进行本地模型编排,结构化/有依据的输出设计(每个综合论断都需要引用证据——杜绝毫无根据的生成),以及感知角色的 prompt 设计(根据文本是已经被抓取,还是仅仅作为像素存在,提供不同的指令)。 - **大规模 Web 抓取:** 15 个针对特定平台的收集器,根据每个网站的实际可靠性采取不同方法——REST API、RSS、内嵌的 JSON blob、JSON-LD 以及无头浏览器渲染——外加一个通用兜底机制,确保没有网站会被遗漏。 - **注重安全的设计:** 防止路径遍历的文件服务、速率限制、绝不进行任何凭据/登录自动化、经过净化的错误处理(原始错误绝不会出现在 AI prompt 或最终文档中)。 - **测试规范:** 214 个测试,100% 离线/模拟,全套测试运行不到 2 秒。 - **在真实约束下进行调试:** 下面“战史”部分提到的一些 bug,涉及逆向工程 Patreon 那些未公开的第三方 JSON 结构,以及在没有任何错误信息提示的情况下,诊断本地推理栈中的静默失败。 ## 它的实际工作原理 1. **我提供链接。** 想给多少给多少,针对同一个实体。网站、YouTube、Instagram、Facebook、LinkedIn、GitHub、Medium、Substack、Reddit、X/Twitter、Linktree/Beacons/stan.store、Patreon、Ko-fi/Buy Me a Coffee、Twitch,或者字面意义上的任何其他网站(它为此配备了通用的兜底收集器——绝不让任何一个网站掉队)。 2. **它抓取每一个链接。** 每个平台使用专门构建的收集器(而不仅仅是“截图然后祈祷”)——有 API 的地方就调用真实 API(YouTube、GitHub、Reddit 的 JSON endpoint),隐藏在页面中的结构化数据(LinkedIn 的 JSON-LD,Patreon 内嵌的 JSON:API blob),理智之选的 RSS(Medium、Substack、Google News),以及其他一切情况下的无头浏览器渲染 + 文本提取。 3. **它贴心地免费为你添加新闻源。** 如果我给了它一个实体名称,它会自动附加针对该名称的 Google News 搜索。我甚至都没要求。它就这么做了。真是个卷王。 4. **本地视觉模型阅读每一张截图。** 这不是为了重新转录我已经抓取过的文本(那样做只会导致 AI 极其自信地告诉你某位 YouTuber 有“451K 次观看”,而实际数字是 451——这是真事儿,问我是怎么知道的),而是描述布局、品牌、氛围,并对那些真正只作为像素存在的内容(登录受限的社交媒体预览、信息图、缩略图)进行 OCR。 5. **本地推理 LLM 将一切综合** 成一份档案:包含每个来源的事实发现,外加一个“推断见解”部分,该部分深入解读商业模式、目标受众、定位和变现方式——在这里,**每一个论断都带有置信度级别和引用的原文**。绝不允许可意淫式的瞎猜。如果它不知道,它会在“缺口与注意事项”中如实说明,而不是胡编乱造。 6. **我拿到的是一份文档**,而不是一堆原始抓取数据转储而成的表格。你可以选择 Markdown,或者点击一下按钮获取一份正规的服务器端渲染、带页码等全套配置的 PDF。 ## “等等,我凭什么相信这玩意”环节 问得好。为了防止这货自信满满地对我撒谎,我专门做了这些设计: - **文本优先,视觉作为后备。** 如果我已经抓取了页面的真实文本,我会指示视觉模型描述*设计*,而不是重新读取文字——因为重新读取文字正是数字产生幻觉的罪魁祸首。(参见上文整个 451 对比 451K 的惨剧。我学到了教训。并且很痛苦。) - **每一次推断都需要凭据。** 综合 prompt 在法律层面上绝不允许模型在没有支撑的情况下写出“他们可能月入 1 万美元”——它必须写成 `**论断** — (置信度: 中等) — 证据: "来自真实来源的引用" [平台]`,否则就别想写进去。 - **失败被设计得很无趣。** 如果某个来源返回 404、被限流,或者某个平台认为我的 IP 看起来像个机器人(虽然无礼,但也公平,它确实是个机器人),档案里就只会写 *“未发现值得注意的公开信息。”* 它绝不会在我的精美研究文档里打印出“HTTP 403”或堆栈跟踪。那些东西只属于它们该待的调试视图。 - **任何地方都不进行登录自动化。** Instagram、Facebook、LinkedIn、Reddit、Patreon——全部处于未登录状态,尽力而为,仅限公开数据。我不想导致账号被封或 IP 被列入黑名单。有些来源返回的数据会比较单薄。这就是礼貌抓取的代价,而且我认为这是正确的做法。 ## 架构,写给那些“我确实想知道怎么做到的”人群 ``` paste links │ ▼ COLLECTORS (per platform, run per job) ──▶ screenshots + text + structured facts │ ▼ VISION STAGE (local Qwen3.5-9B-VL via llama.cpp) │ reads screenshots; role-aware prompt (full OCR vs. "just vibes/branding") ▼ SYNTHESIS STAGE (local gpt-oss-20b, high reasoning, map-reduce over every source) │ ▼ ONE DOSSIER (Markdown + on-demand PDF) ``` - **后端:** FastAPI + 单 worker 异步任务队列。为什么是单 worker?因为我的 GPU 一次只能容纳一个模型——视觉模型和综合模型像打接力一样轮流上阵,如果同时切换两个模型肯定会把我的 VRAM 烧了。SQLite 负责处理任务存储、YouTube 配额账本以及 TTL 缓存,让重复查询零成本。 - **抓取:** Playwright(无头 Chromium)+ httpx + BeautifulSoup。截图提供给视觉模型;提取的 DOM 文本直接提供给综合模型(通常这比让 AI 眯着眼睛看截图更准确)。 - **本地 AI runtime:** [llama.cpp](https://github.com/ggml-org/llama.cpp) 的 `llama-server`,CUDA 版本,正在运行: - **视觉模型:** `Qwen3.5-9B-Q8_0` ——这是在真实截图上与 Gemma-4-12B 进行了一场硬核实测 PK 后做出的选择。Gemma 将“451 次观看”读成了“451K 次观看”,并且凭空捏造了一个名为 **“PowerDog”** 且根本不存在的频道。而 Qwen 答对了。我有提交历史中的记录为证。这绝不是开玩笑。 - **综合模型:** `gpt-oss-20b`,采用高推理强度——因为从三句话的个人简介中推断创作者的变现策略,毫不夸张地说,是一项推理任务。 - **前端:** 原生 HTML/CSS/JS。不用框架,不用构建步骤,不用 400MB 的 `node_modules` 在角落里对我指指点点。它就能跑起来,而且我一口气就能看完所有代码。 - **任务 ID 是连续的,并且有点小惊喜:** 第一个任务是 `ABC0001`,然后是 `ABC0002`,一直到 `ABC9999`,接着像里程表一样翻滚到 `ABD0001`,如果我跑了 26³ × 9999 个任务,它就会增加第四个字母。我选择相信我永远达不到那个极限。如果你达到了,请提一个 issue,我有话要问你。 ## 平台覆盖率 15 个专用收集器,外加一个基于 Playwright 的通用兜底机制,它会礼貌地尝试抓取你向它抛出的任何其他网站。 | 平台 | 实现方式 | 备注 | |---|---|---| | **YouTube** | 官方 Data API v3 + 免费字幕获取 + 评论 | 唯一拥有真正官方认可 API 的平台。我把它当大爷一样供着。 | | **GitHub** | REST API | 仓库、README、编程语言、关注者。无需认证,毫无波澜。 | | **LinkedIn** | 解析每个公开页面内嵌的 Google SEO JSON-LD blob | 公司*和*个人页面。没错,那些数据就大剌剌地摆在那里。 | | **Reddit** | 公开的 `.json` endpoint,带有 `old.reddit.com` 的 HTML 兜底 | 因为有时候 JSON API 就因为你活着就对你返回 403 错误,而老版本的 Reddit 依然会开门迎客。 | | **Patreon** | 解析内嵌的 Next.js JSON blob,获取真实的会员等级 + 价格 | 这个花了番大功夫去侦察——Patreon 将等级数据隐藏在 JSON:API 的“sideloading”模式背后,我不得不对照实际页面进行逆向工程。值了:获取到的是真实的 `$3/月`、`$7/月` 的等级定价,全凭真实数据。 | | **Ko-fi / Buy Me a Coffee** | og 标签抓取 + soft-404 检测器 | 有趣的事实:对于不存在的创作者,Ko-fi 会返回 200 状态码和一个伪造的“页面”,而不是真正的 404。我捕捉到了这一点,所以它不会被报告为真实的个人资料。贼得很啊,Ko-fi。贼得很。 | | **Instagram / Facebook** | 尽力的未登录渲染 + og 解析 | 这些平台*真的*不欢迎匿名爬虫在附近转悠,所以有时只能获取到部分数据。这不是 bug,这就是 Instagram 本身的行为。 | | **Medium / Substack** | RSS 订阅源 | 互联网中纯洁、规矩的角落,这里的抓取基本上就等同于……阅读。 | | **Linktree / Beacons / stan.store** | 发现页面上的所有出站链接 | 一个粘贴过去的链接(link-in-bio)→ 一张包含该创作者在网络上所有其他落脚点的完整地图。简直就是寻宝图。 | | **X / Twitter Twitch** | 基于 og 标签 | 未登录意味着数据很单薄,但简介/标语是真实的信号。 | | **新闻** | 自动附加针对该实体名称的 Google News RSS 搜索 | 免费的额外福利。不客气。 | | **其他所有网站** | 通用 Playwright 渲染 → 文本 + 截图 | “包在我身上”的兜底方案。 | ## 安装与设置 你需要:**Python 3.13**,**拥有约 16GB VRAM 的 NVIDIA GPU**(基于 RTX 5060 Ti 构建和调优——显卡较小可能需要切换到更轻量的模型),以及如果你手头还没有现成的 GGUF 文件(通过 LM Studio 或类似工具),你需要耐心等待一次大模型的下载。 ``` cd Scraper py -3.13 -m venv .venv .venv\Scripts\python -m pip install -r requirements.txt .venv\Scripts\python -m playwright install chromium copy .env.example .env ``` ### 1. YouTube API 密钥(免费,约 3 分钟,无需信用卡) Google Cloud 控制台 → 新建项目 → 启用 *YouTube Data API v3* → 凭据 → 创建 API 密钥 → **将其限制**为仅限该 API 使用。将其粘贴到 `.env` 中的 `YOUTUBE_API_KEY` 处。这能让你每天获得 10,000 个免费的配额单位,这确实非常慷慨——该应用还会积极使用缓存,并且除非你明确要求,否则绝不会触碰昂贵的 `search.list` endpoint。 ### 2. 本地 LLM runtime(llama.cpp) 下载与你 CUDA 版本匹配的 [llama.cpp 发行版](https://github.com/ggml-org/llama.cpp/releases) 构建,将 `llama-server.exe` 及其 DLL 文件放入 `tools/llamacpp/`。将 `backend/config.py`(或你的 `.env`)指向: - **视觉模型:** Qwen3.5-VL-9B GGUF(推荐 Q8)+ 其 `mmproj` 文件 - **综合模型:** gpt-oss-20b GGUF 如果你已经通过 LM Studio 获取了这些模型,配置的默认值就已经指向了 LM Studio 的默认模型文件夹——你可能不需要做任何更改。 ### 3. 运行程序 ``` .venv\Scripts\python -m uvicorn backend.main:app --port 8123 ``` 打开 `http://localhost:8123`。粘贴链接。点击那个红色的大按钮。去喝杯咖啡吧——一个包含视觉分析 + 综合处理、针对多个来源的真实任务确实需要几分钟时间,因为你的 GPU 是在干实打实的活儿,而不是在纯粹凭感觉行事。 ### 4. 运行测试 ``` .venv\Scripts\python -m pytest -q ``` 214 个测试,完全离线(所有内容都被模拟——没有真实的网络调用,没有 GPU 启动),运行时间不到 2 秒。如果测试套件的耗时莫名其妙地远超这个时间,那肯定又是哪个单元测试里混入了真实的网络/模型调用。我已经不止一次抓到自己这么干了。 ## API 接口,献给充满好奇心的人 / 自动化爱好者 ``` POST /api/jobs create a job — {links: [...], entity_name: "..."} GET /api/jobs list recent jobs GET /api/jobs/{id} job status + all collected artifacts GET /api/jobs/{id}/dossier the final Markdown GET /api/jobs/{id}/pdf server-rendered PDF, generated on demand GET /api/jobs/{id}/file?path=... fetch a screenshot/image (path-traversal safe, I checked) GET /api/resolve?q=... raw YouTube channel/video resolution GET /api/channel/{id}, /api/video/{id} full YouTube Data API pass-through (everything public) GET /api/quota live YouTube quota ledger GET /api/instagram/{username} standalone Instagram lookup (feature-flagged) ``` 每个响应都遵循 `{data, cached, fetched_at, quota}` 格式;每个错误都遵循 `{error: {reason, message}}` 格式,并带有真实的 HTTP 状态码。系统启用了速率限制,因为我喜欢我的配额,所以我假设你也喜欢你的配额。 ## 已知的局限性(在此坦诚相告,绝非凡尔赛) - **Reddit、Instagram、Facebook、LinkedIn、Patreon、Ko-fi** 均采用尽力而为的未登录抓取。有时它们会提供全部信息,有时什么都不给还耸耸肩。这是抓取那些极力反抗被抓取的平台时的常态,我选择了“优雅降级”而不是“登录进去冒着被封号的风险”。 - **不支持 TikTok。** 我的开发机器处于地理封锁区域,而且未登录状态下的数据也很单薄。已将其视为未来可添加的有效项,但目前尚未实现。 - **没有服务端视频/音频分析。** 它读取的是像素和文本,而不是声音。 - **这是一个研究工具,而不是大规模监控工具。** 它是为通过你已有的链接一次查找一个实体而构建的——请别把它指向成千上万的人。另外:关于你如何使用输出结果,请保持人类应有的体面。 - **采用 MIT 许可证。** 随便用,fork 它,混合重塑它,胆子大就把它卖了——只要保留版权声明即可。没有保证,没有责任,标准套路。 关于“我接下来会开发什么”的清单,请查看 [`suggestions.txt`](suggestions.txt)(GitHub 深度挖掘、针对 2 个及以上实体的对比模式、自定义研究问题、用于跟踪随时间变化的定时重新运行等等)。 ## 简短而真实的“战史”环节 因为一份毫无个性的 README 对 README 家族来说就是一种犯罪: - **伟大的截图失踪案:** llama.cpp 会默默地丢弃过大的图片,而不是报错。我花了一段时间纳闷,为什么视觉模型在“读取”一张 7000 像素高的截图后什么也没返回,后来才意识到图片根本没有进入模型。它就这么……消失了。消失在虚空中。没有道歉,没有解释。最终通过先将所有图片缩小到合理尺寸解决了这个问题。 - **AI 差点将其内心独白泄露到专业文档中:** gpt-oss 是一个推理模型,当它在思考过程中耗尽了 token,它可能会返回原始的内部推理过程,而不是最终答案。我的第一个版本里有一个兜底机制,如果真实答案为空,它就会把那段推理过程直接打印到档案里。这意味着,有段时间,一份研究文档可能会以类似 *"好吧,我需要弄清楚这个创作者到底是做什么的..."* 的内容作为开头,而不是,你知道,一个真正的答案。极度不专业。已修复。 - **Ko-fi 的 soft-404:** 上面提到过,但这绝对是极其隐蔽的 bug 之一——一个“成功”的 200 响应,暗地里却只是穿着风衣的首页。 - **Gemma 与 Qwen 视觉模型的巅峰对决:** 我并不是随便选了一个视觉模型然后就祈祷。我在一张真实的截图上进行了实打实的正面交锋测试,其中一个模型居然凭空捏造了一个名为“PowerDog”的 YouTuber。绝不是在瞎编。如果你不信,都在 git 日志里。 ## 关于我 我今年 15 岁,靠着含咖啡因的能量饮料和主角光环般的妄想在运转,而且我会半开玩笑地自称为“AI 神” 😅——主要是因为我绝对会在凌晨 1 点,纯粹出于对视觉模型产生幻觉的愤怒,而推翻重写整个 pipeline。这是一个个人爱好项目,做它是因为我希望它能存在,而且除了我自己没人会帮我造出来。如果你发现了 bug,不,你没发现。如果你发现了什么很酷的东西,那都是我故意的。 — vatsaldapro
标签:AV绕过, ESC4, FastAPI, OSINT, Playwright, Splunk, Vectored Exception Handling, 多模态AI, 本地大模型, 特征检测, 运行时操纵, 逆向工具