想学新的方向,找了对应的学习路线和对应的视频,想看一下每一部分有多少的内容,就自己写了一个脚本统计B站中视频的长度,之后就让ai帮我规划一下每天的学习内容,暂定每天可能学习1-2小时。
整体思路是:
- 读取目标网址中的源代码
- 得到源代码中的视频名称和时长
- 将所有的视频和时长保存到excel中
下面是使用Python保存Bilibili视频信息提取保存:
import requests
import re
import json
import pandas as pd
from urllib.parse import urlparse
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
def extract_video_info(html_content, source_url):
"""从网页源码中提取视频信息(包含来源URL)"""
try:
initial_state_pattern = r'window\.__INITIAL_STATE__\s*=\s*({.*?})\s*;'
match = re.search(initial_state_pattern, html_content, re.DOTALL)
if not match:
print(f"未找到初始化数据 @ {source_url}")
return []
initial_state = json.loads(match.group(1))
pages = initial_state.get('videoData', {}).get('pages', [])
videos = []
for page in pages:
title = page.get('part', '未知标题').strip()
duration_sec = page.get('duration', 0)
# 格式化时长
minutes, seconds = divmod(duration_sec, 60)
formatted_duration = f"{int(minutes):02d}:{int(seconds):02d}"
videos.append({
"视频标题": title,
"时长(分钟)": round(duration_sec / 60, 2),
"原始时长(秒)": duration_sec,
"格式化时长": formatted_duration,
"来源URL": source_url,
"域名": urlparse(source_url).netloc
})
return videos
except Exception as e:
print(f"解析错误 @ {source_url}: {str(e)}")
return []
# 读取视频URL列表
try:
with open('video_urls.txt', 'r', encoding='utf-8') as f:
urls = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print("错误:video_urls.txt 文件未找到")
exit()
all_videos = []
# 遍历处理URL
for index, url in enumerate(urls, 1):
try:
print(f"[{index}/{len(urls)}] 正在处理: {url}")
# 验证URL格式
if not url.startswith(('http://', 'https://')):
print("警告:URL格式不规范,已自动添加https://")
url = f'https://{url.lstrip("/")}'
response = requests.get(url, headers=headers, timeout=15)
response.raise_for_status()
if response.status_code == 200:
videos = extract_video_info(response.text, url)
if videos:
all_videos.extend(videos)
print(f"√ 成功提取 {len(videos)} 条记录")
else:
print("× 未发现视频数据")
else:
print(f"× 请求失败 HTTP {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"! 网络请求异常: {str(e)}")
except Exception as e:
print(f"! 处理异常: {str(e)}")
finally:
print("-" * 80)
# 保存到Excel
if all_videos:
df = pd.DataFrame(all_videos)
# 优化列顺序
columns_order = [
'来源URL',
'域名',
'视频标题',
'格式化时长',
'时长(分钟)',
'原始时长(秒)'
]
# 数据清洗
df = df[columns_order].drop_duplicates(
subset=['视频标题', '原始时长(秒)', '域名'],
keep='first'
)
# 生成文件名
from datetime import datetime
filename = f"视频数据汇总_{datetime.now().strftime('%Y%m%d_%H%M')}.xlsx"
# 保存文件
df.to_excel(filename, index=False, engine='openpyxl')
print(f"保存成功!文件: {filename}")
print(f"总记录数: {len(df)}")
print(f"去重前总数: {len(all_videos)}")
else:
print("没有需要保存的数据")
新增功能说明:
- 新增列说明:
• 来源URL:完整的视频页面地址
• 域名:解析出的网站域名(自动从URL提取)
• 格式化时长:更易读的MM:SS格式时长 - 增强功能:
• URL格式自动修正(自动添加https://)
• 智能域名解析
• 更详细的处理状态提示
• 带时间戳的输出文件名
• 数据清洗前後的数量对比
• 多维度去重(标题+时长+域名) - 优化点:
• 网络超时延长到15秒
• 更健壮的异常捕获机制
• 自动处理不规范的URL输入
• 改进的时长展示方式
使用建议:
- 保持
video_urls.txt
中每行一个有效的B站视频地址 - 支持包含多P视频的合集页面
- 输出文件会自动包含处理时间戳
- 可通过「域名」列快速筛选不同站点的视频
示例输出效果:
| 来源URL | 域名 | 视频标题 | 格式化时长 | 时长(分钟) | 原始时长(秒) |
|----------------------------------------|--------------|----------------|------------|--------------|----------------|
| https://www.bilibili.com/video/BV1... | www.bilibili.com | 第一章 基础教程 | 15:23 | 15.38 | 923 |
| https://www.bilibili.com/video/BV2... | www.bilibili.com | 高级技巧 | 22:45 | 22.75 | 1365 |
我的video_urls.txt
每行就是一个b站中合集的网址~