Python自动化抓取GitHub趋势榜

自动化抓取Trending榜单生成每周推荐清单的实现方法

针对如何自动化抓取 GitHub Trending 榜单并生成每周推荐清单的需求,我们可以通过构建一个基于 Python 的自动化情报系统来实现。该方案涵盖了数据采集、智能分析、格式化输出及自动部署的全流程,能够将繁琐的手动检索转化为高效的自动化工作流。

一、 问题解构与方案架构

要实现从"抓取"到"生成清单"的自动化闭环,我们需要解决以下三个核心问题:

  1. 数据获取:如何模拟用户行为,合规且稳定地获取 GitHub Trending 的页面数据。
  2. 内容处理:如何解析非结构化的 HTML 数据,并筛选出高质量的项目。
  3. 自动化输出:如何将处理后的数据格式化为"每周推荐清单",并实现定时自动发布。

基于这三个核心点,我们设计如下的技术架构方案:

模块 核心功能 推荐技术/工具 关键作用
采集层 模拟请求与页面抓取 requests, BeautifulSoup 发送 HTTP 请求,解析 HTML 结构,提取项目名称、简介、Star 数等信息
分析层 数据清洗与智能筛选 Python (Pandas/Logic), AI API (可选) 去重、排序、过滤低质项目;结合 AI 模型(如 DeepSeek/OpenAI)生成项目深度点评
执行层 定时任务与自动化 GitHub Actions, Cron 设定每周触发时间,无需服务器即可运行代码
输出层 清单生成与发布 Markdown 生成, 静态站点 将结果渲染为 Markdown 格式的周报,自动提交到仓库或发送通知

二、 核心实现步骤

1. 数据采集:构建稳健的爬虫脚本

抓取 Trending 榜单的核心在于处理 HTTP 请求和解析 DOM 结构。为了保证程序的健壮性,我们需要加入请求伪装(User-Agent)和异常重试机制 。

以下是一个基于 requestsBeautifulSoup 的核心采集代码示例:

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 文件,从而形成一份持续更新的"每周推荐清单" 。

三、 进阶优化方向

为了使推荐清单更具专业性和实用性,建议结合以下策略进行优化:

  1. 多维度榜单整合:除了综合榜单,可以针对特定语言(如 Python, Go)或特定领域(如 AI, DevOps)分别抓取,生成分类榜单 。
  2. 增量更新与去重:在数据库(如 JSON 或 SQLite)中记录历史项目,确保推荐清单中不重复出现长期霸榜的老项目,优先展示"新上榜"项目 。
  3. 合规性控制 :严格遵守 robots.txt 协议,设置合理的请求间隔,避免对 GitHub 造成压力 。
  4. 自动化通知:当清单生成后,可以通过 Webhook 集成飞书、钉钉或企业微信,自动将周报推送到技术群组 。

通过这套方案,您不仅拥有了一份自动更新的技术资源清单,更构建了一套可复用的开源情报采集与分析框架。


参考来源

相关推荐
吉哥机顶盒刷机2 小时前
Putty跑码中文版:网络机顶盒串口调试完整教程
经验分享·单片机·嵌入式硬件
LaughingZhu3 小时前
Product Hunt 每日热榜 | 2026-03-13
数据库·人工智能·经验分享·神经网络·chatgpt
智者知已应修善业3 小时前
【无序数组指针交换2则】2024-10-28
c语言·数据结构·c++·经验分享·笔记·算法
XiaoXiao_RenHe4 小时前
wps中二级标题15.1显示成1.1问题解决
经验分享
June bug4 小时前
ISTQB CTFL基础级模拟卷C - 第四章(测试分析和设计)考点题目汇总
经验分享·职场和发展·学习方法
代码轨迹4 小时前
从零搭建简易OSS服务:Flask后端+Java客户端完整实践
经验分享
探索宇宙真理.4 小时前
SiYuan 任意HTTP请求漏洞 | CVE-2026-32110 复现&研究
经验分享·开源·安全漏洞·siyuan
诸葛大钢铁4 小时前
如何将NH转为PDF?在线将NH/CAJ/KDH等格式文件转PDF
经验分享·pdf·caj·nh转pdf
赵谨言17 小时前
基于YOLOv5的植物目标检测研究
大数据·开发语言·经验分享·python