这是一个用于爬取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 datetimedef 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 = Nonemax_retries = 3video_data = []seen_titles = set() # 用于去重的标题集合video_id = 1 # 初始化视频IDtry:#修改为你的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-8for page in range(1, 9):retry_count = 0while 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})# 添加标题到已见集合并增加IDseen_titles.add(title)video_id += 1except Exception as e:print(f"处理视频项时出错: {e}")continuebreak # 成功获取数据后跳出重试循环except Exception as e:retry_count += 1print(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_dataif __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次)
- 单个视频解析失败不影响整体运行
- 异常信息实时打印