0
点赞
收藏
分享

微信扫一扫

【自动化脚本】使用Python保存Bilibili视频信息提取保存

想学新的方向,找了对应的学习路线和对应的视频,想看一下每一部分有多少的内容,就自己写了一个脚本统计B站中视频的长度,之后就让ai帮我规划一下每天的学习内容,暂定每天可能学习1-2小时。

整体思路是:

  1. 读取目标网址中的源代码
  2. 得到源代码中的视频名称和时长
  3. 将所有的视频和时长保存到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("没有需要保存的数据")

新增功能说明:

  1. 新增列说明: • 来源URL:完整的视频页面地址
    • 域名:解析出的网站域名(自动从URL提取)
    • 格式化时长:更易读的MM:SS格式时长
  2. 增强功能: • URL格式自动修正(自动添加https://)
    • 智能域名解析
    • 更详细的处理状态提示
    • 带时间戳的输出文件名
    • 数据清洗前後的数量对比
    • 多维度去重(标题+时长+域名)
  3. 优化点: • 网络超时延长到15秒
    • 更健壮的异常捕获机制
    • 自动处理不规范的URL输入
    • 改进的时长展示方式

使用建议:

  1. 保持video_urls.txt中每行一个有效的B站视频地址
  2. 支持包含多P视频的合集页面
  3. 输出文件会自动包含处理时间戳
  4. 可通过「域名」列快速筛选不同站点的视频

示例输出效果:

| 来源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站中合集的网址~

举报

相关推荐

0 条评论