当前位置: 首页 > news >正文

《Python 实现 B 站视频信息爬虫:从批量获取到 CSV 保存》

B 站视频信息爬虫实战:用 Python 批量获取 B 站视频数据

引言

在数据分析和内容研究场景中,获取 B 站视频的标题、播放量、作者等信息是常见需求。本文将介绍如何使用 Python 编写一个 B 站视频爬虫,通过 DrissionPage 库实现自动化数据采集,并保存为 CSV 格式。相比传统 Selenium,DrissionPage 的 API 更简洁,适合快速开发爬虫脚本。

技术栈与环境准备
  • 核心库
    • DrissionPage:基于 Chromium 的自动化操作库,支持元素定位和 JS 执行。
    • csv:处理 CSV 文件读写。
    • re:正则表达式(代码中未直接使用,但爬虫中常用于数据清洗)。
    • os:文件路径操作。
    • time:控制请求间隔,避免频繁请求被封。
  • 安装依赖

pip install drissionpage  # 安装DrissionPage库

首次运行时,库会自动下载 Chromium 浏览器(若未安装),或使用本地已安装的 Chrome/Edge。

代码核心功能解析
1. 初始化与搜索流程

import time

from DrissionPage import ChromiumPage

import csv

import re

import os

# 配置页面

url = 'https://search.bilibili.com/all'

dp = ChromiumPage()

dp.get(url)

key = input("请输入你想爬取的关键词")

# 搜索关键词

dp.ele('css:.search-input-el').input(key)

dp.ele('css:.vui_button.vui_button--blue.vui_button--lg.search-button').click()

time.sleep(2)  # 等待搜索结果加载

  • 核心逻辑:创建浏览器实例,访问 B 站搜索页,通过 CSS 选择器定位搜索框和按钮,输入关键词并点击。
  • 关键点:CSS 选择器需根据 B 站页面结构动态调整(若页面更新,选择器可能失效)。
2. 滚动加载更多视频

# 滚动页面加载更多内容

scroll_times = 20  # 可根据需要调整滚动次数

for i in range(scroll_times):

    dp.run_js('window.scrollTo(0, document.body.scrollHeight)')

    print(f"正在加载更多内容,已滚动 {i + 1}/{scroll_times} 次")

    time.sleep(2)  # 等待新内容加载

  • 原理:通过 JS 执行页面滚动,模拟用户浏览行为,触发 B 站的无限滚动加载机制。
  • 优化点:可改为检测页面是否加载完毕(如判断新元素是否出现),避免固定次数滚动导致资源浪费。
3. CSV 文件操作

# 创建CSV文件并写入表头

csv_file = f"{key}.csv"

try:

    with open(csv_file, 'w', newline='', encoding='utf-8-sig') as f:

        writer = csv.writer(f)

        writer.writerow(['标题', 'up主', 'up主页链接','发布时间', '播放量', '评论量', '视频时长', '视频链接'])

    print(f"CSV文件已创建: {os.path.abspath(csv_file)}")

except Exception as e:

    print(f"创建CSV文件失败: {e}")

  • 注意事项
    • utf-8-sig编码避免 CSV 文件在 Excel 中打开时出现乱码。
    • newline=''防止 Windows 系统中出现多余空行。
4. 视频数据提取与保存

video_cards = dp.eles('css:.col_3.col_xs_1_5.col_md_2.col_xl_1_7.mb_x40')

print(f"检测到 {len(video_cards)} 个视频卡片")

# 遍历卡片提取信息

for card in video_cards:

    try:

        # 提取标题、作者、时间等信息(代码略,见原脚本)

        # ...

        

        # 写入CSV

        data_row = [title, author, up_link, date, views, comments, duration, video_link]

        writer.writerow(data_row)

    except Exception as e:

        print(f"处理视频时出错: {e}")

        continue

  • 元素定位技巧
    • 使用eles('css:选择器')获取多个元素,ele('css:选择器')获取单个元素。
    • 通过attr('属性名')获取元素属性(如链接),text获取文本内容。
  • 异常处理:单个视频提取失败时跳过,保证整体爬取流程不中断。
使用步骤与示例
  1. 运行脚本

python b站爬虫.py

  1. 输入关键词:如 “Python 教程”,脚本将搜索该关键词并爬取结果页视频。
  2. 查看结果:当前目录下生成Python教程.csv文件,包含标题、播放量等信息。
注意事项与优化建议
  1. 反爬机制应对
    • 增加随机延时(如time.sleep(2+random.random()*3)),避免请求过于频繁。
    • 定期更换 IP(或使用代理),防止 IP 被封。
  1. 页面结构变化
    • B 站页面更新可能导致 CSS 选择器失效,需通过浏览器开发者工具重新定位元素。
  1. 数据清洗
    • 播放量、评论量等数据可能包含 “万”“亿” 等单位,需用正则表达式转换为数字(如re.sub('万', '0000', views))。
  1. 效率提升
    • 使用多线程或协程并发爬取,减少总体耗时(需注意控制并发量,避免服务器压力过大)。
结语

本文提供的 B 站爬虫脚本可作为基础模板,适用于数据研究、竞品分析等场景。但需注意:爬虫应遵守网站规则(如查看 B 站的 robots.txt),避免过度爬取影响服务器性能。实际应用中可结合数据库存储、数据可视化等功能,构建更完整的数据分析系统。

如需进一步交流,可在评论区留言探讨爬虫优化方向或遇到的问题! 

http://www.lryc.cn/news/576482.html

相关文章:

  • 数字孪生技术引领UI前端设计新革命:实时交互与模拟预测
  • LINUX628 NFS 多web;主从dns;ntp;samba
  • 鸿蒙5:ArkTS基本介绍
  • VR训练美国服务器:高性能解决方案与优化指南
  • 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法三)不定长滑动窗口+数组
  • 构建 AI 系统的 4 大 Agentic AI 设计模式
  • 网关ARP防护的措施
  • qt和qtcreator版本关系
  • n8n-nodes-puppeteer截图中文变方块乱码解决方法
  • 在单片机中如何实现一个shell控制台
  • Launcher3中的CellLayout 和ShortcutAndWidgetContainer 的联系和各自职责
  • 前端react面试题之实现网页多选搜索框
  • 【学习笔记】深入理解Java虚拟机学习笔记——第12章 Java内存模型与线程
  • python中学物理实验模拟:瞬间推力与摩擦力作用下的物体运动
  • 力扣网C语言编程题:在数组中查找目标值位置之二分查找法
  • 解决cursor无法下载插件等网络问题
  • 深入详解:随机森林算法——概念、原理、实现与应用场景
  • screen用法
  • Gradio全解13——MCP详解(4)——TypeScript包命令:npm与npx
  • 服务器的维护技术都有哪些?
  • Flutter基础(Isolate)
  • 【论文阅读笔记】知网SCI——基于主成分分析的空间外差干涉数据校正研究
  • 开疆智能CCLinkIE转ModbusTCP网关连接傲博机器人配置案例
  • 舵机在不同类型机器人中的应用
  • JVM调优实战 Day 10:性能指标采集与可视化
  • 【闲谈】技术债:软件开发的隐形杀手
  • Redis高级数据结构深度解析:BitMap、布隆过滤器、HyperLogLog与Geo应用实践
  • JWT认证性能优化实战指南
  • 《剖开WebAssembly 2.0:C++/Rust内存管理困局与破局》
  • 剑指offer48_两个链表的第一个公共节点