这是一个用于爬取B站用户空间视频信息的爬虫工具,可以自动收集视频标题、播放量、时长等数据,并导出为CSV格式。
【功能特点】
* 自动爬取B站用户空间的视频信息
* 支持分页爬取(默认1-8页)
* 自动去重功能
* 错误重试机制
* CSV格式数据导出
【环境要求】
1. Python版本
- Python 3.7+
2. 依赖库
- selenium
- webdriver_manager
安装命令:
pip install selenium webdriver_manager
3. Chrome浏览器要求
- 需要安装Chrome浏览器
- 需要下载对应版本的ChromeDriver
- ChromeDriver路径配置示例:
service = Service(executable_path="D:\\Browser\\chrome\\chromedriver-win64\\chromedriver.exe")
【使用方法】
1. 配置ChromeDriver路径
#修改为你的ChromeDriver路径
service = Service(executable_path="D:\\Browser\\chrome\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service, options=options)
driver.set_page_load_timeout(60)
driver.set_script_timeout(60)
2.配置需要爬取的B站博主的主页视频链接
#修改为需要爬取的博主的主页链接
#pn={page}针对多页操作
url = f"https://space.bilibili.com/3816626/video?tid=0&pn={page}&keyword=&order=pubdate"
print(f"正在获取第 {page} 页数据...")
driver.get(url)
time.sleep(5) # 等待页面加载
3. 运行爬虫程序:python bilibili_scraper.py
完整示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import csv
from datetime import datetime
def get_bilibili_videos():
# 配置Chrome选项
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
options.add_argument('--allow-insecure-localhost')
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = None
max_retries = 3
video_data = []
seen_titles = set() # 用于去重的标题集合
video_id = 1 # 初始化视频ID
try:
#修改为你的ChromeDriver路径
service = Service(executable_path="D:\\Browser\\chrome\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service, options=options)
driver.set_page_load_timeout(60)
driver.set_script_timeout(60)
# 遍历页码1-8
for page in range(1, 9):
retry_count = 0
while retry_count < max_retries:
try:
url = f"https://space.bilibili.com/3816626/video?tid=0&pn={page}&keyword=&order=pubdate"
print(f"正在获取第 {page} 页数据...")
driver.get(url)
time.sleep(5) # 等待页面加载
# 查找所有视频项
video_items = WebDriverWait(driver, 20).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li.small-item.fakeDanmu-item"))
)
for item in video_items:
try:
# 获取标题
title = item.find_element(By.CSS_SELECTOR, "a.title").get_attribute('title')
# 如果标题已存在,跳过这个视频
if title in seen_titles:
continue
# 获取视频时长
video_length = item.find_element(By.CSS_SELECTOR, "span.length").text
# 获取播放量
view_count = item.find_element(By.CSS_SELECTOR, "span.play span").text
# 获取发布时间
upload_time = item.find_element(By.CSS_SELECTOR, "span.time").text.strip()
# 将数据添加到列表
video_data.append({
'video_id': video_id,
'title': title,
'view_count': view_count,
'video_length': video_length,
'time': upload_time
})
# 添加标题到已见集合并增加ID
seen_titles.add(title)
video_id += 1
except Exception as e:
print(f"处理视频项时出错: {e}")
continue
break # 成功获取数据后跳出重试循环
except Exception as e:
retry_count += 1
print(f"第 {page} 页第 {retry_count} 次尝试失败: {e}")
if retry_count < max_retries:
print(f"等待 5 秒后重试...")
time.sleep(5)
else:
print(f"第 {page} 页达到最大重试次数,继续下一页")
# 导出到CSV文件
csv_filename = f"bilibili_videos_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
with open(csv_filename, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=['video_id', 'title', 'view_count', 'video_length', 'time'])
writer.writeheader()
writer.writerows(video_data)
print(f"成功获取 {len(video_data)} 个视频信息,已保存到 {csv_filename}")
except Exception as e:
print(f"发生错误: {e}")
finally:
if driver:
driver.quit()
return video_data
if __name__ == "__main__":
get_bilibili_videos()
【数据格式】
输出CSV文件格式:
文件命名规则:bilibili_videos_YYYYMMDD_HHMMSS.csv
包含字段:
- video_id: 视频编号(整数)
- title: 视频标题(字符串)
- view_count: 播放量(字符串)
- video_length: 视频时长(字符串)
- time: 发布时间(字符串)
示例数据:
video_id,title,view_count,video_length,time
1,示例视频标题,1.2万,12:34,2024-01-01
【程序运行框架】
1. 初始化配置
- 配置Chrome选项
- 初始化WebDriver
- 设置重试参数
2. 数据爬取
- 遍历目标页面(1-8页)
- 提取视频信息
- 数据去重处理
3. 数据存储
- CSV文件导出
- 自动命名保存
【错误处理】
- 页面加载失败自动重试(最多3次)
- 单个视频解析失败不影响整体运行
- 异常信息实时打印