为什么我抛弃了 cloud scrapers 并构建了一个 local‑first Reddit 工具

发布: (2025年12月19日 GMT+8 08:05)
5 min read
原文: Dev.to

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 字符串有强烈看法等问题提问。

Back to Blog

相关文章

阅读更多 »