1. 项目概述
Product Hunt作为全球知名的产品发现平台,每天都有数百款新产品上线。这个每日热榜项目旨在通过自动化方式抓取并整理Product Hunt平台上当日最受欢迎的产品,为创业者、产品经理和科技爱好者提供及时的市场趋势参考。
我最初做这个项目的动机很简单:作为连续创业者,每天手动浏览Product Hunt既耗时又容易错过优质产品。通过自动化抓取和结构化展示,不仅能提高信息获取效率,还能通过历史数据分析产品趋势。
2. 技术实现方案
2.1 数据抓取模块
核心采用Python的Scrapy框架构建爬虫,主要考虑到其成熟的分布式爬取能力和对JavaScript渲染页面的处理支持。针对Product Hunt的反爬机制,我们实现了以下关键策略:
class ProductHuntSpider(scrapy.Spider): name = 'producthunt' custom_settings = { 'DOWNLOAD_DELAY': 3, 'CONCURRENT_REQUESTS': 1, 'USER_AGENT': 'Mozilla/5.0...' } def start_requests(self): yield scrapy.Request( url='https://www.producthunt.com/', callback=self.parse, meta={'playwright': True} )重要提示:设置合理的请求间隔(3秒)和并发数(1)是避免被封禁的关键。实测超过2个并发请求就会触发验证码。
2.2 数据处理流程
原始数据经过以下处理步骤:
- 去重:基于产品ID建立布隆过滤器
- 清洗:使用BeautifulSoup处理HTML标签
- 结构化:提取关键字段包括:
- 产品名称
- 得票数
- 创始人信息
- 产品分类
- 简短描述
- 讨论热度
2.3 存储方案选择
对比了三种存储方案后,最终选择MongoDB作为主数据库:
| 方案 | 写入速度 | 查询性能 | 适合场景 |
|---|---|---|---|
| MySQL | 中等 | 高 | 关系型数据 |
| MongoDB | 高 | 中等 | 非结构化数据 |
| Elasticsearch | 低 | 极高 | 全文搜索 |
选择理由:产品数据字段不固定,MongoDB的schema-free特性更适合这种场景。同时建立了以下索引:
- 复合索引:{date: -1, votes: -1}
- 单字段索引:{category: 1}
3. 核心功能实现
3.1 热度算法设计
基础热度值计算公式:
热度 = (当日投票数 × 0.6) + (评论数 × 0.3) + (分享数 × 0.1)针对新产品的冷启动问题,增加了时间衰减因子:
最终热度 = 基础热度 × e^(-0.5×小时数/24)3.2 每日榜单生成
通过Airflow设置DAG任务,每天UTC时间8:00自动执行:
- 抓取当日数据
- 计算热度值
- 生成TOP 20榜单
- 发送邮件通知订阅用户
关键代码片段:
def generate_daily_report(): pipeline = [ {'$match': {'date': {'$gte': start_of_day}}}, {'$sort': {'hot_score': -1}}, {'$limit': 20}, {'$project': { 'name': 1, 'votes': 1, 'url': 1, 'description': 1 }} ] results = db.products.aggregate(pipeline) return list(results)4. 部署与优化
4.1 服务器配置
使用AWS EC2 t3.xlarge实例,主要配置:
- vCPU: 4
- 内存: 16GB
- 存储: 100GB GP3
实测可以支持:
- 并发爬取:5个Product Hunt分类页面
- 每日处理数据量:约300-500个产品
4.2 性能优化技巧
- 缓存策略:对分类页面实施1小时缓存
- 连接池:维持10个持久化HTTP连接
- 错误重试:指数退避算法,最大重试3次
5. 数据分析应用
通过历史数据可以发现一些有趣趋势:
- 周三上线的产品平均热度比其他工作日高15%
- 开发工具类产品在Q1季度上线最多
- 含"AI"关键词的产品近半年增长300%
示例分析查询:
db.products.aggregate([ {'$group': { '_id': {'weekday': {'$dayOfWeek': '$date'}}, 'avgVotes': {'$avg': '$votes'} }} ])6. 常见问题解决
6.1 反爬虫规避
遇到的主要挑战及解决方案:
| 问题现象 | 解决方案 | 效果 |
|---|---|---|
| 返回403错误 | 轮换User-Agent和代理IP | 成功率提升至95% |
| 验证码拦截 | 使用2Captcha服务 | 额外成本$0.5/100次 |
| 数据加载不全 | 启用Playwright渲染 | 数据完整度100% |
6.2 数据不一致处理
建立数据校验机制:
- 字段完整性检查
- 投票数合理性验证(>1000需人工复核)
- 每日数据量波动监控(设置±30%预警线)
7. 项目扩展方向
目前正在开发的功能:
- 竞品对比分析:自动识别相似产品并生成对比报告
- 创始人追踪:建立创业者产品发布历史图谱
- 预测模型:基于历史数据预测产品成功概率
实现思路示例:
# 竞品分析伪代码 def find_similar_products(target): embeddings = get_bert_embeddings(target['description']) return db.products.aggregate([ {'$vectorSearch': { 'queryVector': embeddings, 'path': 'description_embedding', 'limit': 5 }} ])这个项目给我最大的启示是:数据获取只是第一步,如何从海量信息中提炼出真正有价值的洞察才是核心竞争力。下一步计划引入更多机器学习技术来提高分析深度。