Python爬虫——获取B站博主主页视频信息

这是一个用于爬取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次)
- 单个视频解析失败不影响整体运行
- 异常信息实时打印

 

Python 爬虫爬取 B 视频通常涉及到网页数据抓取、解析以及处理等步骤。下面简要介绍如何使用 Python 和相应的库完成这一任务: ### 选择合适的工具 对于网页爬取,Python 提供了多种强大的库,如 `requests` 用于发起 HTTP 请求,`BeautifulSoup` 或 `lxml` 用于解析 HTML 页面内容。 ### 获取视频链接 首先,你需要确定你要爬取的视频链接。B 的视频链接一般由几个部分组成: 1. **频道ID**(Channel ID) 2. **视频ID**(Video ID) 例如,链接可能是 `/video/avxxxxxx` 的形式,其中 `'xxxxxx'` 即为视频 ID。 ### 使用 Python 进行请求和解析 #### 发起 GET 请求 使用 `requests.get()` 函数获取页面的内容。这一步主要是为了获取到包含视频信息的相关 HTML 内容。 ```python import requests from bs4 import BeautifulSoup def get_video_html(video_id): url = f'https://www.bilibili.com/video/{video_id}' response = requests.get(url) if response.status_code == 200: return response.text else: print('Failed to fetch the video page') return None ``` #### 解析页面内容 使用 `BeautifulSoup` 对获取的HTML文本进行解析,查找包含视频播放地址的标签或属性。 ```python def parse_video_url(html_text): soup = BeautifulSoup(html_text, 'html.parser') # 假设视频链接在script标签内隐藏,需要找到并提取出来 script_tag = soup.find('script', id='_playInfoScript') if script_tag is not None: play_info = eval(script_tag.string) # 将字符串转换为字典 video_url = play_info['data']['dash']['video']['baseUrl'] return video_url else: print('Video URL not found') return None ``` ### 下载视频 有了视频的实际链接,就可以下载视频内容了。这里可以使用 `requests` 的 `stream=True` 参数进行大文件下载,并通过迭代逐块读取和保存。 ```python import os def download_video(video_url, output_file): response = requests.get(video_url, stream=True) total_size_in_bytes = int(response.headers.get('content-length', 0)) progress_bar_length = 50 with open(output_file, "wb") as file: for data in response.iter_content(chunk_size=8192): file.write(data) done = int(50 * len(file.read()) / total_size_in_bytes) percent_done = (len(file.read()) / total_size_in_bytes) * 100 print(f'\rDownloading... [{("█" * done).ljust(progress_bar_length)}] {percent_done:.2f}%', end='') print() if __name__ == "__main__": video_id = 'xxxxxx' html_text = get_video_html(video_id) if html_text: video_url = parse_video_url(html_text) if video_url: filename = f'av{video_id}.mp4' download_video(video_url, filename) print(f'Successfully downloaded {filename}') else: print('Could not find a valid video URL.') else: print('Failed to fetch video content.') ``` ### 法律及伦理考虑 请注意,在进行网络爬虫活动时,务必遵守网的使用条款和法律法规。特别是从网上抓取数据前,应检查其robots.txt 文件,并确认是否允许爬虫访问相关数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值