2026/1/30 17:44:16
网站建设
项目流程
学校网站建设维护投标方案,南昌公路建设有限公司网站,免费国外永久域名注册,网站百度抓取哔哩哔哩#xff08;B 站#xff09;的 item_search_video 接口是通过关键词批量检索平台视频列表的核心工具#xff0c;支持按分区、发布时间、播放量、UP 主类型等多维度筛选#xff0c;返回视频基础信息、互动数据、UP 主信息等关键内容。该接口广泛适用于内容聚合平台搭…哔哩哔哩B 站的item_search_video接口是通过关键词批量检索平台视频列表的核心工具支持按分区、发布时间、播放量、UP 主类型等多维度筛选返回视频基础信息、互动数据、UP 主信息等关键内容。该接口广泛适用于内容聚合平台搭建、视频选题调研、行业数据分析、舆情监测等场景。本攻略从接口认知、前置准备、实操对接、调试优化到合规上线提供结构化的全流程指导兼顾入门易用性与生产级稳定性助力开发者高效完成对接。一、接口核心认知功能与适配场景1. 接口定位与核心价值核心功能输入搜索关键词支持多关键词组合筛选 B 站全品类视频番剧、UP 主自制、直播回放等支持分区过滤、时间范围筛选、排序规则自定义返回分页视频列表可联动item_get_video接口获取单视频精细化详情。B 站平台特性数据覆盖收录 B 站 90% 以上公开视频涵盖游戏、知识、生活、娱乐等 30 分区新视频收录延迟 5-10 分钟专属筛选维度支持按分区如游戏 - 原神、UP 主认证类型个人 / 企业 / 官方、视频类型原创 / 转载筛选适配精细化检索需求互动数据前置搜索结果直接返回播放量、点赞数、弹幕数等核心互动指标无需二次调用多关键词逻辑支持空格分隔AND 逻辑同时含多个关键词、竖线|分隔OR 逻辑含任一关键词。典型应用场景内容聚合工具搭建垂直领域视频平台如 “Python 教程”“美食探店” 专区按关键词聚合 B 站相关视频选题调研UP 主通过关键词检索分析同类视频的热度、标签、互动数据辅助确定创作方向行业数据分析按行业关键词如 “新能源汽车评测”采集视频数据统计分区热度、用户偏好舆情监测追踪品牌 / 事件关键词相关视频实时监控播放量、评论数变化掌握舆论走向。2. 核心参数与返回字段1请求参数必填 可选按优先级排序参数名称类型是否必填说明应用示例appkeystring是接口调用密钥由 B 站开放平台 / 合规服务商分配bilibili_abc123secretstring是签名密钥用于请求合法性校验不可泄露bilibili_def456keywordstring是搜索关键词支持多关键词组合AND 用空格OR 用 Python教程 零基础、 旅行 vlog美食探店 categorystring否视频分区筛选值为分区英文名需参考 B 站分区字典game游戏、knowledge知识、life生活time_rangestring否发布时间范围默认all全部1day1 天内、7days7 天内、30days30 天内、custom自定义需配合 start/end_datestart_datestring否自定义开始日期time_rangecustom 时必填格式YYYY-MM-DD2025-01-01end_datestring否自定义结束日期time_rangecustom 时必填格式YYYY-MM-DD2025-12-31sort_typestring否排序方式默认relevance相关度优先play播放量倒序、pubtime发布时间倒序、like点赞数倒序、danmaku弹幕数倒序up_typestring否UP 主认证类型默认all全部personal个人认证、enterprise企业认证、official官方认证copyrightint否版权类型默认0全部1原创、2转载page_noint否页码默认1最大支持100页1、5、10page_sizeint否每页视频数默认20最大支持5020、30、50timestamplong是请求时间戳毫秒级有效期 5 分钟避免重复请求1735689600000signstring是签名值按 B 站规则生成核心校验项32 位 MD5 大写串注意事项分区参数category需与 B 站官方分区英文名一致可通过服务商文档获取分区字典时间范围优先级custom模式下start_date和end_date必须同时传入且时间跨度不超过 1 年排序方式play对应的是近 30 天播放量非累计播放量适配爆款视频筛选。2返回核心字段按业务场景分类字段分类核心字段说明视频基础信息bvid视频 BV 号对外唯一标识title视频标题含分区前缀、营销文案cover_url视频封面图 URL高清duration视频时长秒pubdate发布时间时间戳 / 格式化字符串category视频分区如 “游戏 - 原神”tags视频标签列表如 “Python”“教程”“零基础”copyright版权类型1 原创2 转载state视频状态0 正常-1 审核中-2 已下架互动数据view近 30 天播放量like点赞数danmaku弹幕数favorite收藏数coin投币数share转发数UP 主信息up_idUP 主 IDup_nameUP 主昵称up_avatarUP 主头像 URLup_typeUP 主认证类型up_fansUP 主粉丝数部分接口需企业权限分页信息total关键词匹配视频总数page_no当前页码page_total总页码3. 接口限制与注意事项调用频率限制账号类型调用频率适用场景个人开发者5 次 / 分钟个人选题调研、小型数据分析企业开发者30 次 / 分钟商业内容聚合、舆情监测系统数据缓存规则搜索结果缓存 30 分钟热门关键词如 “原神”“演唱会”缓存缩短至 10 分钟企业用户可申请refresh1强制刷新需额外权限内容限制已下架 / 违规视频、隐私视频仅粉丝可见、未过审视频不会返回番剧等版权内容仅返回基础信息无播放链接合规要求禁止通过接口批量抓取视频源文件搜索结果需标注 “数据来源哔哩哔哩”二次传播需遵守 B 站版权规则。二、对接前准备权限与环境搭建1. 获取接口权限两种接入方式B 站item_search_video接口无公开免费接入渠道需通过官方开放平台或合规第三方服务商获取权限具体对比如下接入方式操作步骤优缺点B 站开放平台官方1. 登录 B站开放平台2. 完成账号认证个人实名认证 / 企业营业执照认证3. 创建应用选择 “内容数据 / 视频搜索” 类目4. 提交item_search_video接口申请附业务用途说明5. 审核通过后在应用详情页获取appkey和secret优点数据权威、字段完整、合规性强缺点审核严格企业需提供业务证明、周期长3-7 个工作日、部分字段需专项授权第三方合规服务商1. 选择口碑合规的服务商如聚合数据、APISpace2. 注册账号并完成实名认证3. 购买 B 站视频搜索接口套餐4. 在服务商后台获取appkey和接口调用地址优点接入快10 分钟完成、无需复杂资质、调试工具完善缺点部分进阶字段如 UP 主粉丝数需付费升级、调用次数有配额限制风险提示严禁使用非法爬虫接口违反 B 站《用户协议》及《网络安全法》存在账号封禁、法律追责风险。2. 技术环境准备1支持语言与协议协议HTTPS强制保障数据传输安全开发语言支持 Python、Java、PHP、Go 等所有主流语言推荐Python数据处理便捷适配批量检索场景。2必备工具与依赖工具类型推荐工具用途调试工具Postman快速验证接口可用性排除代码逻辑干扰在线 MD5 工具校验签名生成正确性B 站分区字典查询工具获取category参数的正确取值开发依赖requestsPython发送 HTTP 请求hashlibPython生成接口签名pandasPython批量整理视频列表数据jsonpath-ng快速解析嵌套 JSON 响应辅助工具Redis缓存搜索结果减少重复请求logging记录接口调用日志便于问题追溯三、实操步骤接口对接全流程Python 示例步骤 1理解 B 站接口签名规则B 站官方接口与第三方服务商接口均采用MD5 加密签名核心逻辑为参数排序 拼接密钥 MD5 加密具体步骤如下剔除参数中的sign字段若存在将剩余参数按参数名 ASCII 升序排序拼接成key1value1key2value2...的字符串在字符串末尾拼接secret你的secret对拼接后的字符串进行 MD5 加密生成 32 位大写字符串即为sign。签名示例假设参数appkeybilibili_abc123、keywordPython教程、sort_typeplay、timestamp1735689600000、secretbilibili_def456排序后参数appkey、keyword、sort_type、timestamp拼接字符串appkeybilibili_abc123keywordPython%E6%95%99%E7%A8%8Bsort_typeplay×tamp1735689600000secretbilibili_def456MD5 加密后得到sign3A9F7C2D1E0B86453210FEDCBA789654。步骤 2完整代码实现Python1依赖安装bashpip install requests pandas jsonpath-ng2核心代码含签名生成、接口调用、数据保存import requests import hashlib import time import json import pandas as pd from urllib.parse import urlencode import logging # 封装好API供应商demo urlhttps://console.open.onebound.cn/console/?iLex # 日志配置记录接口调用与错误信息 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[logging.FileHandler(bilibili_item_search_video.log), logging.StreamHandler()] ) # 接口配置替换为自身的appkey、secret、接口地址 CONFIG { appkey: 你的appkey, secret: 你的secret, api_url: https://api.example.com/bilibili/item_search_video, # 官方/服务商接口地址 save_path: B站视频搜索列表.xlsx } def generate_sign(params: dict, secret: str) - str: 生成B站接口签名MD5 32位大写 # 1. 移除sign字段 params.pop(sign, None) # 2. 按参数名ASCII升序排序 sorted_params sorted(params.items(), keylambda x: x[0]) # 3. 拼接参数字符串并追加secret param_str urlencode(sorted_params, encodingutf-8) fsecret{secret} # 4. MD5加密 md5 hashlib.md5() md5.update(param_str.encode(utf-8)) return md5.hexdigest().upper() def standardize_video_data(raw_video: dict) - dict: 标准化视频数据统一输出格式 # 格式化发布时间 pubdate raw_video.get(pubdate, 0) pubdate_str time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(pubdate)) if pubdate else # 格式化视频时长 duration raw_video.get(duration, 0) duration_str f{duration//60}:{duration%60:02d} return { 搜索关键词: raw_video.get(keyword, ), BV号: raw_video.get(bvid, ), 视频标题: raw_video.get(title, ), 封面链接: raw_video.get(cover_url, ), 视频时长: duration_str, 发布时间: pubdate_str, 视频分区: raw_video.get(category, ), 视频标签: ,.join(raw_video.get(tags, [])) if raw_video.get(tags) else , 版权类型: 原创 if raw_video.get(copyright, 2) 1 else 转载, 视频状态: 正常 if raw_video.get(state, 0) 0 else 已下架/违规, 近30天播放量: raw_video.get(view, 0), 点赞数: raw_video.get(like, 0), 弹幕数: raw_video.get(danmaku, 0), 收藏数: raw_video.get(favorite, 0), 投币数: raw_video.get(coin, 0), 转发数: raw_video.get(share, 0), UP主ID: raw_video.get(up_id, ), UP主昵称: raw_video.get(up_name, ), UP主认证类型: raw_video.get(up_type, ), UP主粉丝数: raw_video.get(up_fans, 0), 请求时间: time.strftime(%Y-%m-%d %H:%M:%S, time.localtime()) } def bilibili_item_search_video( keyword: str, category: str None, time_range: str all, start_date: str None, end_date: str None, sort_type: str relevance, up_type: str all, copyright: int 0, page_no: int 1, page_size: int 20 ) - dict: 调用B站item_search_video接口获取关键词视频列表 :param keyword: 搜索关键词 :param category: 视频分区 :param time_range: 发布时间范围 :param start_date: 自定义开始日期 :param end_date: 自定义结束日期 :param sort_type: 排序方式 :param up_type: UP主认证类型 :param copyright: 版权类型 :param page_no: 页码 :param page_size: 每页条数 :return: 标准化的视频列表数据 # 1. 校验参数合法性 if time_range custom and not (start_date and end_date): logging.error(time_rangecustom时start_date和end_date为必填参数) return {success: False, error_msg: 缺少自定义时间参数} # 2. 构建基础参数 params { appkey: CONFIG[appkey], keyword: keyword, time_range: time_range, sort_type: sort_type, up_type: up_type, copyright: copyright, page_no: page_no, page_size: page_size, timestamp: int(time.time() * 1000) } # 3. 补充可选参数 if category: params[category] category if time_range custom: params[start_date] start_date params[end_date] end_date # 4. 生成签名 params[sign] generate_sign(params, CONFIG[secret]) try: # 5. 发送POST请求 response requests.post( urlCONFIG[api_url], datajson.dumps(params), headers{Content-Type: application/json}, timeout15, verifyTrue ) response.raise_for_status() # 抛出HTTP异常 result response.json() # 6. 解析响应结果 if result.get(code) 0 or result.get(status) success: raw_data result.get(data, {}) video_list raw_data.get(item_list, []) total raw_data.get(total, 0) page_total raw_data.get(page_total, 1) # 标准化视频数据 standard_videos [] for video in video_list: video[keyword] keyword # 补充关键词字段 standard_videos.append(standardize_video_data(video)) return { success: True, data: standard_videos, total: total, page_no: page_no, page_total: page_total, error_msg: } else: error_msg result.get(msg, result.get(message, 接口调用失败)) logging.error(f接口返回错误关键词{keyword}{error_msg}code{result.get(code)}) return {success: False, error_msg: error_msg} except requests.exceptions.RequestException as e: logging.error(f网络请求异常关键词{keyword}{str(e)}) return {success: False, error_msg: f网络异常{str(e)}} except Exception as e: logging.error(f数据解析异常关键词{keyword}{str(e)}) return {success: False, error_msg: f解析异常{str(e)}} def batch_get_video_list( keyword: str, max_page: int 5, **kwargs ) - list: 批量获取多页视频列表控制调用频率 all_videos [] page_no 1 while True: logging.info(f正在获取关键词「{keyword}」第 {page_no} 页视频) result bilibili_item_search_video(keywordkeyword, page_nopage_no, **kwargs) if not result[success]: logging.error(f第 {page_no} 页获取失败{result[error_msg]}) break page_videos result[data] if not page_videos: logging.info(f第 {page_no} 页无视频数据批量获取结束) break all_videos.extend(page_videos) logging.info(f第 {page_no} 页获取成功新增 {len(page_videos)} 条数据累计 {len(all_videos)} 条) # 终止条件达到最大页码或总页码 if page_no max_page or page_no result[page_total]: break page_no 1 # 控制频率个人用户间隔12秒企业用户间隔2秒 time.sleep(12) return all_videos def save_video_list(videos: list, save_path: str CONFIG[save_path]): 将视频列表保存为Excel文件支持增量去重 if not videos: logging.warning(无视频数据可保存) return df pd.DataFrame(videos) # 按BV号去重 df df.drop_duplicates(subset[BV号]) # 增量保存 try: history_df pd.read_excel(save_path, engineopenpyxl) df pd.concat([history_df, df], ignore_indexTrue).drop_duplicates(subset[BV号]) except FileNotFoundError: pass df.to_excel(save_path, indexFalse, engineopenpyxl) logging.info(f视频列表已保存至 {save_path}共 {len(df)} 条数据) # 封装好API供应商demo urlhttps://console.open.onebound.cn/console/?iLex # 调用示例 if __name__ __main__: # 单页获取示例搜索“Python教程 零基础”按播放量排序知识分区近30天 single_page_result bilibili_item_search_video( keywordPython教程 零基础, categoryknowledge, time_range30days, sort_typeplay, page_size20 ) if single_page_result[success]: print(f获取到 {len(single_page_result[data])} 条视频数据) for video in single_page_result[data][:5]: # 打印前5条 print(f标题{video[视频标题]} | 播放量{video[近30天播放量]} | UP主{video[UP主昵称]}) else: print(f单页获取失败{single_page_result[error_msg]}) # 批量获取示例获取前5页数据并保存 # batch_videos batch_get_video_list( # keywordPython教程 零基础, # categoryknowledge, # time_range30days, # sort_typeplay, # max_page5 # ) # save_video_list(batch_videos)四、调试与问题排查快速解决对接异常1. 优先用 Postman 调试排除代码逻辑干扰构造请求新建 POST 请求填写接口 URL请求头设置Content-Type: application/json填写参数在请求体中输入appkey、keyword、timestamp等必填项按需补充筛选参数生成签名用在线 MD5 工具手动计算sign填入参数发送请求查看响应结果验证接口是否正常返回数据。2. 高频问题排查表问题现象常见原因解决方案签名错误4011. 参数排序错误2.secret不匹配3. 时间戳过期4. 中文未 URL 编码1. 按 ASCII 升序排序参数并打印验证2. 核对secret与后台一致3. 校准本地时间误差≤5 分钟4. 确保urlencode处理特殊字符权限不足4031. 未申请item_search_video接口权限2. 普通账号使用企业字段如 UP 主粉丝数3. 调用频率超限1. 在开放平台确认接口已开通2. 移除企业专属参数或升级账号3. 增加请求间隔降低调用频率参数错误4001.category取值错误非官方分区名2.time_rangecustom未传日期3.sort_type取值非法1. 查阅服务商文档获取正确分区字典2. 补充start_date和end_date3. 核对sort_type取值参考参数表无视频数据返回1. 关键词过于精准 / 无匹配视频2. 筛选条件过于严格3. 视频未被接口收录1. 放宽关键词如 “Python 零基础” 改为 “Python 教程”2. 移除分区 / 时间等筛选条件3. 在 B 站官网搜索关键词确认是否有相关视频字段缺失如无 UP 主粉丝数1. 账号无企业权限2. 接口版本不支持3. UP 主隐私设置隐藏粉丝数1. 升级为企业账号或申请专项权限2. 联系服务商升级接口版本3. 忽略该字段仅保留基础信息五、进阶优化生产级稳定性提升1. 性能优化异步并发请求多关键词 / 多页码批量获取时使用aiohttp实现异步请求控制并发数≤5避免频率超限效率比同步提升 4-6 倍智能缓存策略用 Redis 缓存关键词筛选条件组合的搜索结果缓存 keybilibili_search_关键词_时间范围_分区有效期 30 分钟对无结果的关键词缓存空结果有效期 10 分钟避免无效请求分页智能停止获取第 1 页后根据page_total计算总页码仅请求有效页码避免page_no超过总页码的无效请求。2. 数据质量优化数据去重按BV号去重避免同一视频多次入库异常值过滤过滤播放量为 0、状态为下架的无效数据关键词扩展结合 jieba 分词对核心关键词进行扩展如 “Python 教程” 扩展为 “Python 零基础教程、Python 进阶教程”提升搜索覆盖率。3. 合规与安全密钥管理生产环境中将appkey和secret存储在环境变量或配置中心如 Nacos禁止硬编码定期轮换密钥每 3 个月一次数据合规搜索结果仅用于合规业务禁止商业化售卖引用视频数据时标注来源二次创作需获得 UP 主授权日志审计详细记录每次接口调用的参数、响应、错误信息保留至少 7 天日志便于合规审计与问题追溯。六、扩展场景接口联动与功能升级联动item_get_video接口通过item_search_video获取bvid列表后批量调用item_get_video获取视频分 P、字幕、播放链接等精细化详情爆款视频分析模型结合播放量、点赞率点赞 / 播放、弹幕率等指标构建爆款评分公式自动筛选优质视频实时关键词监测使用APScheduler定时调用接口监控目标关键词的视频新增量、播放量变化触发舆情 / 爆款告警