尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【2026最新B站爬虫分享】用Python批量爬取热门视频数据,含UP主粉丝数、标签一键导出!

【2026最新B站爬虫分享】用Python批量爬取热门视频数据,含UP主粉丝数、标签一键导出! 您好我是iFeng的小屋一枚4年程序猿。一、爬取目标B站热门视频区是了解当前流行趋势的好地方但手动一页页翻太慢而且播放量、弹幕、点赞等数据要一个个点进去看UP主的粉丝数还得另外查。想做数据分析光靠肉眼太费劲。爬取目标网址https://www.bilibili.com/v/popular/all二、展示爬取结果话不多说先看成果。爬取结果包含以下字段序号、标题、链接、UP主、UP主ID、UP主粉丝数精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、评论数发布时间、视频时长(秒)、视频简介、标签、视频aid、BV号三、原理讲解热门视频接口B站热门视频有公开APIhttps://api.bilibili.com/x/web-interface/popular?ps20pn{page}返回JSON包含视频列表每页20条。视频详情返回的列表中包含视频的标题、BV号、UP主ID、播放统计等基础信息。UP主粉丝数通过另一个接口https://api.bilibili.com/x/relation/stat?vmid{mid}获取返回粉丝数。视频标签通过接口https://api.bilibili.com/x/tag/archive/tags?aid{aid}获取返回标签列表。数据清洗用pandas处理缺失值数值填0、文本填空并剔除时长10秒或播放数≤0的异常记录。三、爬虫代码讲解导入库import requests import pandas as pd import time import random from datetime import datetime3.1 核心思路与配置爬虫封装成两个类BilibiliDataCollector负责采集DataPreprocessor负责清洗。这样结构清晰后期维护方便。3.2 关键步骤获取热门视频列表def get_popular_videos(self, pages30): all_videos [] for page in range(1, pages 1): api_url fhttps://api.bilibili.com/x/web-interface/popular?ps20pn{page} time.sleep(random.uniform(1, 3)) # 随机延迟避免被封 response requests.get(api_url, headersself.headers) data response.json() videos data[data][list] for video in videos: video_data self.extract_video_info(video) if video_data: all_videos.append(video_data) return pd.DataFrame(all_videos)3.3 关键步骤提取视频信息def extract_video_info(self, video, index): title video.get(title, ) bvid video.get(bvid, ) aid video.get(aid, ) owner video.get(owner, {}) author_id owner.get(mid, ) stat video.get(stat, {}) pubdate video.get(pubdate, 0) publish_date datetime.fromtimestamp(pubdate).strftime(%Y-%m-%d %H:%M:%S) if pubdate else 未知 follower_count self.get_up_follower_count(author_id) # 调接口查粉丝数 tags self.get_video_tags(aid, bvid) # 调接口查标签 return { 序号: index, 标题: title, 链接: fhttps://www.bilibili.com/video/{bvid}, up主: owner.get(name, ), up主id: author_id, up主粉丝数: follower_count, 精确播放数: stat.get(view, 0), 历史累计弹幕数: stat.get(danmaku, 0), 点赞数: stat.get(like, 0), 投硬币枚数: stat.get(coin, 0), 收藏人数: stat.get(favorite, 0), 转发人数: stat.get(share, 0), 评论数: stat.get(reply, 0), 发布时间: publish_date, 视频时长(秒): video.get(duration, 0), 视频简介: video.get(desc, ), 标签: tags, 视频aid: aid, BV号: bvid }3.5 数据清洗class DataPreprocessor: def clean_data(self, df): df_cleaned df.copy() numeric_columns [精确播放数, 历史累计弹幕数, 点赞数, ...] for col in numeric_columns: df_cleaned[col] df_cleaned[col].fillna(0) text_columns [标题, up主, 视频简介, 标签] for col in text_columns: df_cleaned[col] df_cleaned[col].fillna() df_cleaned df_cleaned[ (df_cleaned[视频时长(秒)] 10) (df_cleaned[精确播放数] 0) ] return df_cleaned3.6 主函数def main(): collector BilibiliDataCollector() df_raw collector.get_popular_videos(pages20) # 可修改页数 if df_raw.empty: print(未获取到数据程序结束) return # 保存原始数据 raw_filename fraw_bilibili_data_{datetime.now().strftime(%Y%m%d_%H%M%S)}.csv df_raw.to_csv(raw_filename, indexFalse, encodingutf-8-sig) preprocessor DataPreprocessor() df_cleaned preprocessor.clean_data(df_raw) preprocessor.save_cleaned_data(df_cleaned, cleaned_bilibili_data.csv)四、如何运行安装依赖pip install requests pandas修改页数在main()函数中修改pages参数默认20。运行脚本直接执行等待爬取完成。查看结果当前目录下会生成raw_bilibili_data_时间戳.csv和cleaned_bilibili_data.csv两个文件。五、说明请求频率代码中已加入随机延迟但如果你爬取大量数据建议再适当增加间隔。接口稳定性B站API偶尔会调整如果发现某个字段为空请检查代码中的键名是否需要更新。数据清洗清洗步骤可根据自己需求调整比如你想保留所有数据可以注释掉过滤部分。完整源码上述代码为核心模块完整可运行的源码包含更详细的异常处理和注释已打包整理。需要本文完整可运行Python源码的小伙伴我都放在了与此号同名的公众号里大家自行获取。持续分享Python干货中更多爬虫源码干货请前往主页查看~
返回列表