自动化爬虫程序,每天收集 Product Hunt 上的 top 10 产品并存储到数据库中。
强烈建议使用 Product Hunt API
由于 Product Hunt 网站有反爬虫保护,网页抓取方式可能会被阻止(403 Forbidden 错误)。强烈建议使用官方 API。
获取 API 凭证的步骤:
- 访问 Product Hunt API
- 注册 Product Hunt 账号并登录
- 创建一个新的应用以获取 API Key 和 API Secret
- 将凭证添加到
.env文件中
- 支持 Product Hunt GraphQL API(推荐)和网页抓取两种方式
- 自动存储产品信息到 SQLite 数据库
- 支持定时任务,每天自动抓取
- 支持手动抓取指定日期的产品
- 完整的日志记录
- 数据去重,避免重复存储
product_hunt_crawler/
├── src/
│ ├── __init__.py
│ ├── config.py # 配置管理
│ ├── models.py # 数据库模型
│ ├── database.py # 数据库操作
│ ├── crawler.py # 爬虫逻辑
│ └── scheduler.py # 定时任务调度
├── data/ # 数据库文件目录(自动创建)
├── main.py # 主程序入口
├── requirements.txt # Python 依赖
├── .env.example # 环境变量示例
├── .gitignore
└── README.md
git clone <repository-url>
cd product_hunt_crawlerpython -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windowspip install -r requirements.txt复制 .env.example 到 .env 并根据需要修改:
cp .env.example .env编辑 .env 文件:
# Product Hunt API 凭证(可选,如果不提供将使用网页抓取)
PRODUCT_HUNT_API_KEY=your_api_key
PRODUCT_HUNT_API_SECRET=your_api_secret
# 数据库路径
DATABASE_PATH=data/products.db
# 定时任务配置(每天几点几分运行)
SCHEDULE_HOUR=9
SCHEDULE_MINUTE=0
# 日志级别
LOG_LEVEL=INFO如果你还没有配置 API 凭证,可以先运行演示脚本查看功能:
python demo.py这将使用示例数据展示完整的功能,包括数据抓取、存储和查询。
python main.py --once注意:需要先配置 Product Hunt API 凭证,否则会因为反爬虫保护而失败。
python main.py --once --date 2025-10-20python main.py --schedule程序会在配置的时间(默认每天 9:00)自动运行,同时会在启动时立即运行一次。
python main.py --statspython main.py --help- 访问 Product Hunt API
- 注册并创建应用
- 获取 API Key 和 API Secret
- 将凭证添加到
.env文件
注意: Product Hunt API 默认不允许商业用途。如需商业使用,请联系 hello@producthunt.com
如果不提供 API 凭证,程序会自动使用网页抓取方式获取数据。网页抓取方式不需要 API 凭证,但可能受到以下限制:
- 可能无法获取完整的产品描述
- 抓取速度较慢
- 可能受到网站反爬虫机制限制
程序使用 SQLite 数据库,products 表结构如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键,自增 |
| product_id | VARCHAR(100) | Product Hunt 产品 ID |
| name | VARCHAR(255) | 产品名称 |
| tagline | VARCHAR(500) | 产品标语 |
| description | TEXT | 产品描述 |
| votes | INTEGER | 投票数 |
| url | VARCHAR(500) | 产品链接 |
| thumbnail_url | VARCHAR(500) | 缩略图链接 |
| featured_at | VARCHAR(20) | 上榜日期 (YYYY-MM-DD) |
| rank | INTEGER | 排名 (1-10) |
| created_at | DATETIME | 记录创建时间 |
| updated_at | DATETIME | 记录更新时间 |
唯一约束: (product_id, featured_at) - 同一产品在同一天只会存储一次
你可以使用任何 SQLite 工具查询数据库,例如:
# 使用 sqlite3 命令行工具
sqlite3 data/products.db
# 查询最近的产品
SELECT name, tagline, votes, featured_at, rank
FROM products
ORDER BY featured_at DESC, rank
LIMIT 10;
# 查询某一天的 top 10
SELECT rank, name, votes
FROM products
WHERE featured_at = '2025-10-22'
ORDER BY rank;
# 统计已收集的天数
SELECT COUNT(DISTINCT featured_at) as total_days
FROM products;程序使用 APScheduler 进行定时任务调度。默认配置为每天 9:00 运行。
修改运行时间:在 .env 文件中设置:
SCHEDULE_HOUR=14 # 14点(下午2点)
SCHEDULE_MINUTE=30 # 30分程序会输出详细的日志信息,包括:
- 爬虫运行状态
- 抓取的产品信息
- 数据库操作结果
- 错误信息
日志级别可以在 .env 文件中配置:
LOG_LEVEL=INFO # 可选值:DEBUG, INFO, WARNING, ERROR, CRITICAL如果网页抓取失败,可能的原因:
- Product Hunt 网站结构变化
- 网络连接问题
- 被反爬虫机制拦截
解决方案:
- 使用 Product Hunt API(提供 API 凭证)
- 检查网络连接
- 增加请求间隔时间
可能的原因:
- API 凭证错误
- API 配额用尽
- API 服务不可用
解决方案:
- 检查 API 凭证是否正确
- 查看 API 使用配额
- 程序会自动降级到网页抓取方式
如果遇到数据库错误:
- 确保
data目录有写入权限 - 检查磁盘空间
- 如果数据库损坏,可以删除
data/products.db重新开始
创建服务文件 /etc/systemd/system/ph-crawler.service:
[Unit]
Description=Product Hunt Crawler
After=network.target
[Service]
Type=simple
User=your_user
WorkingDirectory=/path/to/product_hunt_crawler
Environment="PATH=/path/to/venv/bin"
ExecStart=/path/to/venv/bin/python main.py --schedule
Restart=always
[Install]
WantedBy=multi-user.target启动服务:
sudo systemctl enable ph-crawler
sudo systemctl start ph-crawler
sudo systemctl status ph-crawler创建 Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py", "--schedule"]构建并运行:
docker build -t ph-crawler .
docker run -d --name ph-crawler -v $(pwd)/data:/app/data ph-crawler添加 cron 任务每天运行一次:
# 编辑 crontab
crontab -e
# 添加任务(每天 9:00 运行)
0 9 * * * cd /path/to/product_hunt_crawler && /path/to/venv/bin/python main.py --once >> logs/cron.log 2>&1MIT License
欢迎提交 Issue 和 Pull Request!
本项目仅供学习和研究使用。使用时请遵守 Product Hunt 的服务条款和 robots.txt 规则。
- 请勿过于频繁地请求数据
- 请勿用于商业用途(除非获得授权)
- 请尊重网站的反爬虫机制
如有问题或建议,请提交 Issue。