Beatifulsoup 快速实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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