Skip to content

cszhouwei/product_hunt_crawler

Repository files navigation

Product Hunt Top 10 Crawler

自动化爬虫程序,每天收集 Product Hunt 上的 top 10 产品并存储到数据库中。

重要提示

强烈建议使用 Product Hunt API

由于 Product Hunt 网站有反爬虫保护,网页抓取方式可能会被阻止(403 Forbidden 错误)。强烈建议使用官方 API

获取 API 凭证的步骤:

  1. 访问 Product Hunt API
  2. 注册 Product Hunt 账号并登录
  3. 创建一个新的应用以获取 API Key 和 API Secret
  4. 将凭证添加到 .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

安装

1. 克隆项目

git clone <repository-url>
cd product_hunt_crawler

2. 创建虚拟环境(推荐)

python -m venv venv
source venv/bin/activate  # Linux/Mac
#
venv\Scripts\activate     # Windows

3. 安装依赖

pip install -r requirements.txt

4. 配置环境变量

复制 .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-20

启动定时任务(每天自动运行)

python main.py --schedule

程序会在配置的时间(默认每天 9:00)自动运行,同时会在启动时立即运行一次。

查看数据库统计信息

python main.py --stats

查看帮助信息

python main.py --help

Product Hunt API

获取 API 凭证

  1. 访问 Product Hunt API
  2. 注册并创建应用
  3. 获取 API Key 和 API Secret
  4. 将凭证添加到 .env 文件

注意: Product Hunt API 默认不允许商业用途。如需商业使用,请联系 hello@producthunt.com

无 API 凭证的情况

如果不提供 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

故障排除

网页抓取失败

如果网页抓取失败,可能的原因:

  1. Product Hunt 网站结构变化
  2. 网络连接问题
  3. 被反爬虫机制拦截

解决方案:

  • 使用 Product Hunt API(提供 API 凭证)
  • 检查网络连接
  • 增加请求间隔时间

API 调用失败

可能的原因:

  1. API 凭证错误
  2. API 配额用尽
  3. API 服务不可用

解决方案:

  • 检查 API 凭证是否正确
  • 查看 API 使用配额
  • 程序会自动降级到网页抓取方式

数据库错误

如果遇到数据库错误:

  1. 确保 data 目录有写入权限
  2. 检查磁盘空间
  3. 如果数据库损坏,可以删除 data/products.db 重新开始

生产环境部署

使用 systemd (Linux)

创建服务文件 /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

使用 Docker

创建 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(简单方式)

添加 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>&1

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

免责声明

本项目仅供学习和研究使用。使用时请遵守 Product Hunt 的服务条款和 robots.txt 规则。

  • 请勿过于频繁地请求数据
  • 请勿用于商业用途(除非获得授权)
  • 请尊重网站的反爬虫机制

联系方式

如有问题或建议,请提交 Issue。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages