B站封面提取:用影片連結獲取原圖,附 BV 號與儲存方法
B站封面提取的目標,是拿到影片封面圖片本身,而不是給影片畫面截圖。 截圖可能帶播放按鈕、字幕或頁面縮放,封面地址則對應平臺返回的圖片資源。
本文是一篇操作教程,不是已經上線的線上封面提取器。可以在瀏覽器中查詢圖片,也可以用下面的 Python 示例讀取公開影片的封面地址。
第一步:從連結找到 BV 號
完整影片連結的路徑通常包含 BV 號,例如 https://www.bilibili.com/video/BV1GJ411x7h7/。只需要其中的 BV1GJ411x7h7,後面的分享引數不需要一起復制。
如果拿到的是 b23.tv 分享短連結,先在瀏覽器裡開啟,等它跳到影片頁後再複製完整地址。不要把短連結末尾的字元當成 BV 號。
方法一:在瀏覽器查詢封面圖片
- 開啟影片頁,按 F12 或瀏覽器的“檢查”開啟開發者工具。
- 在頁面原始碼或 Elements 中搜尋
og:image。如果找到對應 meta 標籤,複製它的content圖片地址。 - 將圖片地址在新標籤頁開啟,再選擇儲存圖片。
- 如果頁面沒有這項資訊,開啟 Network,篩選圖片請求,尋找與影片封面一致的資源;不要隨意執行別人要求貼上到控制檯的指令碼。
不同頁面版本的標籤結構可能變化。找不到 og:image 不代表沒有封面,需要換另一種方法。
方法二:用 Python 讀取封面地址
B站公開介面當前可返回影片資訊,其中 data.pic 是封面地址。2026 年 10 月 9 日核查了下面示例的介面響應。這不是我們擁有穩定性保證的 API 合約,介面可能調整、限流,或對部分影片返回錯誤。
import json
from urllib.request import Request, urlopen
bvid = "BV1GJ411x7h7" # 换成目标视频的 BV 号
url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}"
request = Request(url, headers={"User-Agent": "Mozilla/5.0"})
with urlopen(request, timeout=15) as response:
result = json.load(response)
if result.get("code") != 0:
raise RuntimeError(result.get("message", "读取视频信息失败"))
cover = result.get("data", {}).get("pic")
if not cover:
raise RuntimeError("响应中没有封面地址")
print(cover)
執行後,把列印出的地址放進瀏覽器開啟並儲存。這段程式碼只讀取影片資訊,不下載影片,也不需要帳戶 Cookie。介面示例見B站影片資訊響應。
提取出來的圖片是高畫質原圖嗎?
先檢查儲存後圖片的實際畫素尺寸,而不是瀏覽器顯示得有多大。平臺返回的資源不一定等於創作者最初上傳檔案的完整尺寸,也不能憑空恢復原圖沒有的細節。
如果複製的是帶縮放或格式引數的地址,比較不同資源的實際尺寸再選擇;不要把所有圖片 URL 的字尾都機械刪除。遇到 WebP 檔案,也不要僅改副檔名就稱為 PNG。
常見失敗原因
| 現象 | 先檢查什麼 |
|---|---|
| 介面提示找不到影片 | BV 號是否完整、影片是否仍公開可訪問 |
| 返回限流或請求被拒絕 | 停止連續重試,稍後用瀏覽器單次檢視 |
| 瀏覽器顯示空圖片 | 地址是否複製完整,影片是否使用預設或特殊封面 |
| 前端 fetch 報跨域錯誤 | 瀏覽器跨域限制不等於介面沒有封面;本文示例執行在本地 Python |
| 儲存的是頁面 HTML | 是否開啟了圖片資源,而不是影片頁面 |
能提取 YouTube 封面嗎?
B站和 YouTube 的影片標識、介面不同,不能把 YouTube 連結塞進這個 B站示例。要批次儲存自己有權使用的影片素材,可以另外瞭解yt-dlp。封面可訪問也不等於可隨意轉載,釋出時仍需確認原作者授權。