《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获取文本内容。
- 异常处理:单个视频提取失败时跳过,保证整体爬取流程不中断。
使用步骤与示例
- 运行脚本:
python b站爬虫.py |
- 输入关键词:如 “Python 教程”,脚本将搜索该关键词并爬取结果页视频。
- 查看结果:当前目录下生成Python教程.csv文件,包含标题、播放量等信息。
注意事项与优化建议
- 反爬机制应对:
- 增加随机延时(如time.sleep(2+random.random()*3)),避免请求过于频繁。
- 定期更换 IP(或使用代理),防止 IP 被封。
- 页面结构变化:
- B 站页面更新可能导致 CSS 选择器失效,需通过浏览器开发者工具重新定位元素。
- 数据清洗:
- 播放量、评论量等数据可能包含 “万”“亿” 等单位,需用正则表达式转换为数字(如re.sub('万', '0000', views))。
- 效率提升:
- 使用多线程或协程并发爬取,减少总体耗时(需注意控制并发量,避免服务器压力过大)。
结语
本文提供的 B 站爬虫脚本可作为基础模板,适用于数据研究、竞品分析等场景。但需注意:爬虫应遵守网站规则(如查看 B 站的 robots.txt),避免过度爬取影响服务器性能。实际应用中可结合数据库存储、数据可视化等功能,构建更完整的数据分析系统。
如需进一步交流,可在评论区留言探讨爬虫优化方向或遇到的问题!