自动化抓取Trending榜单生成每周推荐清单的实现方法
针对如何自动化抓取 GitHub Trending 榜单并生成每周推荐清单的需求,我们可以通过构建一个基于 Python 的自动化情报系统来实现。该方案涵盖了数据采集、智能分析、格式化输出及自动部署的全流程,能够将繁琐的手动检索转化为高效的自动化工作流。
一、 问题解构与方案架构
要实现从"抓取"到"生成清单"的自动化闭环,我们需要解决以下三个核心问题:
- 数据获取:如何模拟用户行为,合规且稳定地获取 GitHub Trending 的页面数据。
- 内容处理:如何解析非结构化的 HTML 数据,并筛选出高质量的项目。
- 自动化输出:如何将处理后的数据格式化为"每周推荐清单",并实现定时自动发布。
基于这三个核心点,我们设计如下的技术架构方案:
| 模块 | 核心功能 | 推荐技术/工具 | 关键作用 |
|---|---|---|---|
| 采集层 | 模拟请求与页面抓取 | requests, BeautifulSoup |
发送 HTTP 请求,解析 HTML 结构,提取项目名称、简介、Star 数等信息 |
| 分析层 | 数据清洗与智能筛选 | Python (Pandas/Logic), AI API (可选) | 去重、排序、过滤低质项目;结合 AI 模型(如 DeepSeek/OpenAI)生成项目深度点评 |
| 执行层 | 定时任务与自动化 | GitHub Actions, Cron | 设定每周触发时间,无需服务器即可运行代码 |
| 输出层 | 清单生成与发布 | Markdown 生成, 静态站点 | 将结果渲染为 Markdown 格式的周报,自动提交到仓库或发送通知 |
二、 核心实现步骤
1. 数据采集:构建稳健的爬虫脚本
抓取 Trending 榜单的核心在于处理 HTTP 请求和解析 DOM 结构。为了保证程序的健壮性,我们需要加入请求伪装(User-Agent)和异常重试机制 。
以下是一个基于 requests 和 BeautifulSoup 的核心采集代码示例:
python
import requests
from bs4 import BeautifulSoup
import csv
import time
import random
def fetch_github_trending(language="", period="daily"):
"""
抓取 GitHub Trending 页面数据
:param language: 编程语言,如 'python' (留空则为全部)
:param period: 周期,'daily' 或 'weekly'
:return: 解析后的项目列表
"""
url = f"https://github.com/trending/{language}?since={period}"
# 请求头伪装,模拟浏览器访问,规避基础的反爬策略
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查请求是否成功
except requests.exceptions.RequestException as e:
print(f"网络请求异常: {e}")
return []
# 使用 BeautifulSoup 解析 HTML 内容
soup = BeautifulSoup(response.text, 'html.parser')
repo_list = []
# 定位包含项目信息的 article 标签
articles = soup.find_all('article', class_='Box-row')
for article in articles:
try:
# 提取项目名称 (作者/项目名)
repo_header = article.find('h2', class_='h3 lh-condensed')
repo_name = repo_header.get_text().replace('
', '').replace(' ', '')
# 提取项目简介
desc_paragraph = article.find('p', class_='col-9')
description = desc_paragraph.get_text().strip() if desc_paragraph else "无简介"
# 提取 Star 数 (包含 k 或 k 后缀的需处理)
star_span = article.find('a', href=lambda x: x and '/stargazers' in x)
stars = star_span.get_text().strip() if star_span else "0"
repo_list.append({
'name': repo_name,
'description': description,
'stars': stars,
'url': f"https://github.com/{repo_name}"
})
except AttributeError as e:
print(f"解析单条数据时出错: {e}")
continue
return repo_list
# 执行抓取并打印预览
if __name__ == '__main__':
trending_repos = fetch_github_trending(language="python", period="weekly")
for repo in trending_repos[:3]:
print(repo)
代码要点说明:
- 请求伪装 :通过
headers设置真实的User-Agent,避免被 GitHub 直接拦截 。 - 结构解析 :GitHub Trending 页面主要由
article.Box-row标签构成,利用 BeautifulSoup 的层级查找精准定位数据 。 - 容错处理 :在提取字段时使用
try-except块,防止因某个字段缺失(如无简介)导致整个程序崩溃 。
2. 数据增强与清单生成
单纯的列表数据缺乏可读性,我们可以将其转化为结构化的 Markdown 周报。更进一步,我们可以引入 AI 模型对项目进行智能点评,提升清单的附加值 。
python
def generate_weekly_report(repos, week_number):
"""
生成 Markdown 格式的每周推荐清单
"""
report_content = f"""# GitHub 热门项目周报 (第 {week_number} 周)
"
"本周精选了以下热门开源项目,涵盖前端、后端及 AI 领域,供您参考。
"
"---
"""
for index, repo in enumerate(repos, 1):
# 这里可以预留接口调用 AI API 生成点评
# ai_comment = get_ai_summary(repo['description'])
ai_comment = "(待集成 AI 点评:该项目在架构设计上具有创新性...)"
report_content += f"""
### {index}. {repo['name']} ⭐ {repo['stars']}
**项目地址**: [{repo['name']}]({repo['url']})
**简介**: {repo['description']}
**AI 深度解读**: {ai_comment}
---
"""
return report_content
# 示例:生成报告
# report = generate_weekly_report(trending_repos, 42)
# print(report)
3. 自动化部署:利用 GitHub Actions 实现零服务器运行
为了实现"每周"自动生成,我们可以利用 GitHub Actions。这种方式无需购买服务器,完全免费且稳定 。
在项目仓库中创建 .github/workflows/weekly_report.yml 文件:
yaml
name: Weekly Trending Report
on:
schedule:
# 每周一上午 9 点 (UTC 时间) 自动触发
- cron: '0 9 * * 1'
workflow_dispatch: # 允许手动触发
jobs:
build-and-report:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests beautifulsoup4
- name: Run Trending Script
run: |
python main.py # 运行上文编写的爬虫与生成脚本
- name: Commit and Push Report
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add README.md # 假设生成的报告覆盖到了 README.md
git diff --quiet && git diff --staged --quiet || git commit -m "[Bot] Update Weekly Trending Report"
git push
通过上述配置,系统会在每周一自动运行爬虫脚本,抓取最新数据,更新仓库中的 README.md 文件,从而形成一份持续更新的"每周推荐清单" 。
三、 进阶优化方向
为了使推荐清单更具专业性和实用性,建议结合以下策略进行优化:
- 多维度榜单整合:除了综合榜单,可以针对特定语言(如 Python, Go)或特定领域(如 AI, DevOps)分别抓取,生成分类榜单 。
- 增量更新与去重:在数据库(如 JSON 或 SQLite)中记录历史项目,确保推荐清单中不重复出现长期霸榜的老项目,优先展示"新上榜"项目 。
- 合规性控制 :严格遵守
robots.txt协议,设置合理的请求间隔,避免对 GitHub 造成压力 。 - 自动化通知:当清单生成后,可以通过 Webhook 集成飞书、钉钉或企业微信,自动将周报推送到技术群组 。
通过这套方案,您不仅拥有了一份自动更新的技术资源清单,更构建了一套可复用的开源情报采集与分析框架。
参考来源
- Python爬虫实战:手把手教你用 Python 优雅抓取 GitHub Trending 排行榜!
- GitHub_Trending/ha/Hacktoberfest2023项目文档自动化工具:从生成到部署全流程
- Python 爬虫实战:如何优雅地抓取 GitHub 每日热门开源项目?
- GitHub_Trending/ch/chinese-independent-developer项目维护指南:如何保持项目活跃度
- 我用 Python 写了个GitHub AI Agent,每天自动帮我挖掘 GitHub 热门项目,还能举一反三!
- GitHub中文排行榜实时数据更新策略:如何精准追踪中文开源项目动态