爬虫练手2:github热门语言项目 的文章封面
返回文章列表
Neuroblue writing

爬虫练手2:github热门语言项目

Beatifulsoup 快速实现

import requests
import pandas as pd
from bs4 import BeautifulSoup
from datetime import datetime
import matplotlib.pyplot as plt

def fetch_github_trending(keyword="python", date_range="Today"):
    """
    获取 GitHub 上某个编程语言的趋势仓库。

    参数:
    keyword (str): 要获取趋势仓库的编程语言。默认为 'python'。
    date_range (str): 时间范围,默认为 'Today'。

    返回:
    pd.DataFrame: 包含趋势仓库的 URL 和描述的 DataFrame。
    """
    url = f'https://github.com/trending/{keyword}?since={date_range}'
    main_url = 'https://github.com{0}'
    
    try:
        # 发送 GET 请求到 GitHub 趋势页面
        response = requests.get(url)
        response.raise_for_status()  # 检查响应是否有错误
        html = response.content.decode('utf-8')  # 解码响应内容
    except requests.RequestException as e:
        print(f"从 GitHub 获取数据时出错: {e}")
        return pd.DataFrame()  # 出错时返回空的 DataFrame
    
    # 使用 BeautifulSoup 解析 HTML 内容
    soup = BeautifulSoup(html, 'html.parser')
    boxes = soup.find_all("article", class_="Box-row")
    
    data = []  # 用于存储提取数据的列表
    
    for box in boxes:
        # 查找仓库链接
        h2_tag = box.find('h2', class_='h3 lh-condensed')
        a_tag = h2_tag.find('a', href=True)
        if a_tag:
            url = main_url.format(a_tag['href'])  # 构造完整的 URL
            # 查找仓库描述
            p_tag = box.find('p', class_='col-9 color-fg-muted my-1 pr-4')
            description = p_tag.text.strip() if p_tag and p_tag.text else ''
            # 将 URL 和描述添加到数据列表中
            data.append({'url': url, 'description': description})
    
    # 将数据列表转换为 DataFrame
    df = pd.DataFrame(data)
    return df

def save_to_csv(df, keyword, date_range):
    """
    将 DataFrame 保存为 CSV 文件。

    参数:
    df (pd.DataFrame): 要保存的数据。
    keyword (str): 编程语言。
    date_range (str): 时间范围。
    """
    try:
        if date_range.lower() == "weekly":
            current_date = datetime.now().strftime("%Y-%m")
        elif date_range.lower() == "monthly":
            current_date = datetime.now().strftime("%Y-%m")
        else:
            current_date = datetime.now().strftime("%Y-%m-%d")
        
        filename = f"github_trending_{keyword}_{date_range}_{current_date}.csv"
        df.to_csv(filename, index=False, encoding='utf-8')
        print(f"数据已保存到 {filename}")
    except Exception as e:
        print(f"保存 CSV 文件时出错: {e}")

if __name__ == "__main__":
    # 提示用户输入编程语言
    keyword = input("输入编程语言 (默认: python)(java c++...): ") or "python"
    date_range = input("输入时间范围 (默认: Today)(Weekly,Monthly): ") or "Today"
    
    # 验证时间范围输入
    valid_date_ranges = ["today", "weekly", "monthly"]
    if date_range.lower() not in valid_date_ranges:
        print("无效的时间范围,使用默认值 'Today'")
        date_range = "Today"
    
    # 获取趋势仓库并打印 DataFrame
    df = fetch_github_trending(keyword, date_range)
    print(df)
    
    # 保存结果到 CSV 文件
    save_to_csv(df, keyword, date_range)

效果展示

image-20250416145752984

image-20250416145923778

后记

没什么好写的了属于是。

Don’t know what to learn , ah.

打模拟地铁。

General 7680x4320 Mexico City subway simple background minimalism graph