为什么我抛弃了 cloud scrapers 并构建了一个 local‑first Reddit 工具
Source: Dev.to
云抓取陷阱
我尝试了很多基于云的工具、监控服务、会向服务器回报的浏览器扩展,甚至还有在我的 VPS 上运行的 Python 脚本。
它们都有同一个问题:Reddit 会封锁服务器 IP——而且封锁得很激进。我的 VPS 在运行一个简单的抓取器 5 分钟内就被封了。轮换代理和住宅 IP 也没有帮助;Reddit 总能识别出来。每隔几周,我的监控工具就会发邮件提醒我“我们在 Reddit 上遇到了问题”。
显而易见的解决方案
有位朋友随口说:“为什么不直接在你的电脑上运行呢?”
我当时有顾虑:分发更困难,周期性计费和使用追踪也更复杂。但如果程序在我的笔记本上运行,Reddit 看到的就是我的家庭 IP——普通用户的浏览行为。没有需要规避的检测,直接就能工作。
我做了什么
Python + PyQt6 桌面应用,使用 SQLite 进行存储。
Reddit Toolbox
核心代码简直太简单了:
import requests
import sqlite3
def scrape_subreddit(name, limit=100):
url = f"https://reddit.com/r/{name}.json?limit={limit}"
# That's it. Just a GET request from user's IP.
response = requests.get(url, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
})
if response.status_code == 200:
return response.json()['data']['children']
else:
# Fallback to RSS if JSON is blocked
return scrape_via_rss(name)
RSS 备选方案是关键。有时 Reddit 会对某些模式的 JSON 进行封锁,但 RSS 仍然开放。两者兼备几乎不会完全失效。
真正重要的功能
1. 带过滤条件的批量抓取
粘贴 5 个 subreddit 名称,约 10 秒内抓取每个 200 条帖子。可按以下条件过滤:
- 最大评论数(例如 ≤ 8)
- 最小得分(过滤掉被踩的内容)
2. 右键 AI 回复
生成回复草稿(始终会被大量改写)。
3. 用户分析
在私信某人之前,检查其历史:账户年龄、karma、活跃的 subreddit——快速的合理性检查。
盈利问题
使用网页应用时,你可以控制登录、功能门槛以及服务器端的限制。桌面应用则是用户拥有二进制文件,能随意使用。
我考虑过 DRM、许可证密钥、硬件指纹,但意识到 会去破解每月 15 美元工具的人本来就不打算付费。
于是我保持简单:应用在每个会话开始时通过一次对 Supabase 的 API 调用检查订阅状态。如果检查失败,就降级为免费层(每天 15 次抓取)。有人能绕过吗?可以,但真正需要它进行正式工作的用户愿意付费。
我接受的权衡
- 没有跨设备同步——数据只保存在一台机器上。
- 手动更新——正在开发自动更新器,但尚未完成。
- 零遥测——无法了解用户真实的使用情况,但感觉更好。
结果
- 没有关于封锁的支持工单(相较于云工具每天的各种问题)。
- 应用体积约 50 MB(相比 Electron 版的 150 MB+)。
- 用户喜欢无需登录即可尝试:“终于有工具不先要我的邮箱了。” 那封邮件让我这周心情大好。
本地优先何时合适
本地优先并不适用于所有场景。你仍然需要服务器来实现:
- 实时协作
- 多设备同步
- 社交功能
但对于需要与积极防止抓取的 API 交互的单用户工具来说,本地优先的方式值得考虑。
该工具名为 Reddit Toolbox。如果想试用,提供免费层。
欢迎就 PyQt、架构或我为何对 User‑Agent 字符串有强烈看法等问题提问。