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)
效果展示


后记
没什么好写的了属于是。
Don’t know what to learn , ah.
打模拟地铁。
