1.创建一个文件夹

最好用英文命名,可参考如下:

  • bili_up_spider.py:爬虫程序

  • photo(需要提前创建):保存封面照片

  • bvids.txt(无需提前创建):储存所有视频的BV号

2.python程序

2.1 安装依赖(只需要 requests):

在命令行cmd中输入以下指令安装

pip install requests

可以使用以下指令查看是否已安装requests

pip show requests

2.2完整程序(直接复制即可)

import os
import re
import time
import random
import hashlib
import urllib.parse
from pathlib import Path
from urllib.parse import urlparse

import requests

# ========= 基本配置 =========
VMID = 363112755
OUT_TXT = "bvids.txt"
PHOTO_DIR = "photo"

WBI_API = "https://api.bilibili.com/x/space/wbi/arc/search"
NAV_API = "https://api.bilibili.com/x/web-interface/nav"

# ========= 在这里填你的 Cookie =========
SESSDATA = "YOUR_SESSDATA_HERE"
BILI_JCT = "YOUR_BILI_JCT_HERE"

COOKIE = f"SESSDATA={SESSDATA}; bili_jct={BILI_JCT}"

HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/120.0.0.0 Safari/537.36"
    ),
    "Accept": "application/json, text/plain, */*",
    "Referer": "https://www.bilibili.com/",
    "Cookie": COOKIE,
}

# ========= 风控必需 dm_* =========
DM_PARAMS = {
    "dm_img_list": "[]",
    "dm_img_str": "V2ViR0wgMS",
    "dm_cover_img_str": "SW50ZWwoUikgSEQgR3JhcGhpY3NJbnRlbA",
}

# ========= WBI =========
MIXIN_KEY_ENC_TAB = [
    46,47,18,2,53,8,23,32,15,50,10,31,58,3,45,35,
    27,43,5,49,33,9,42,19,29,28,14,39,12,38,41,13,
    37,48,7,16,24,55,40,61,26,17,0,1,60,51,30,4,
    22,25,54,21,56,59,6,63,57,62,11,36,20,34,44,52
]


def get_ext(url):
    try:
        ext = os.path.splitext(urlparse(url).path)[1]
        return ext if ext else ".jpg"
    except:
        return ".jpg"


def get_wbi_keys(session):
    r = session.get(NAV_API, headers=HEADERS, timeout=15)
    r.raise_for_status()
    j = r.json()
    wbi = j["data"]["wbi_img"]
    img_key = wbi["img_url"].split("/")[-1].split(".")[0]
    sub_key = wbi["sub_url"].split("/")[-1].split(".")[0]
    return img_key, sub_key


def gen_mixin_key(img_key, sub_key):
    raw = img_key + sub_key
    return "".join(raw[i] for i in MIXIN_KEY_ENC_TAB)[:32]


def enc_wbi(params, img_key, sub_key):
    mixin = gen_mixin_key(img_key, sub_key)
    params["wts"] = int(time.time())
    params = dict(sorted(params.items()))
    query = urllib.parse.urlencode(params)
    params["w_rid"] = hashlib.md5((query + mixin).encode()).hexdigest()
    return params


def main():
    base = Path(__file__).parent
    photo_dir = base / PHOTO_DIR
    photo_dir.mkdir(exist_ok=True)

    bvids = []
    info = []

    with requests.Session() as sess:
        img_key, sub_key = get_wbi_keys(sess)
        pn, ps = 1, 50

        while True:
            params = {
                "mid": VMID,
                "pn": pn,
                "ps": ps,
                "order": "pubdate",
                **DM_PARAMS,
            }
            params = enc_wbi(params, img_key, sub_key)

            r = sess.get(WBI_API, headers=HEADERS, params=params, timeout=15)
            r.raise_for_status()
            j = r.json()

            if j["code"] != 0:
                raise RuntimeError(j)

            vlist = j["data"]["list"]["vlist"]
            if not vlist:
                break

            for v in vlist:
                bvid = v["bvid"]
                cover = v["pic"]
                bvids.append(bvid)
                info.append((bvid, cover))

            if pn * ps >= j["data"]["page"]["count"]:
                break

            pn += 1
            time.sleep(random.uniform(1.0, 1.8))

    with open(base / OUT_TXT, "w", encoding="utf-8") as f:
        f.write("\n".join(bvids))

    with requests.Session() as sess:
        for bvid, cover in info:
            path = photo_dir / f"{bvid}{get_ext(cover)}"
            if path.exists():
                continue
            r = sess.get(cover, headers=HEADERS, timeout=20)
            with open(path, "wb") as f:
                f.write(r.content)
            print(f"[OK] {bvid}")
            time.sleep(random.uniform(0.3, 0.6))

    print("\n========== 完成 ==========")
    print(f"BV号数量:{len(bvids)}")


if __name__ == "__main__":
    main()

3.获取SESSDATA 和 BILI_JCT

3.1 打开开发者工具(F12)

  • 在B站页面的任意位置,按下键盘上的 F12 键。

  • 或者,在页面上鼠标右键,选择 “检查”。

3.2 找到“应用程序”或“应用”标签

  • 打开开发者工具后,顶部会有一排选项卡标签(如:元素、控制台、源代码等)。

  • 找到并点击【应用程序】或【应用】。

    • 在 Chrome、Edge、新版Firefox 中叫 应用程序。

    • 在 旧版浏览器或某些设置下 可能叫 应用 或 Storage。

    • (如果没看到,可能被折叠了,可以点击 >> 图标查看更多标签)。

3.3 在 应用程序 面板下,左侧有一个侧边栏。

  • 依次展开:存储 -> Cookie -> https://www.bilibili.com。

  • 点击 https://www.bilibili.com 后,右侧主区域会显示一个表格,里面列出了所有Cookie的名称和值。

3.4 查找并复制目标Cookie

  • 在右侧表格的 名称 列中,慢慢向下滚动查找:

    1. 找到名称为 SESSDATA 的行,点击其 值 列中的那一长串字符(通常以%结尾),完整地复制下来。

    2. 找到名称为 bili_jct 的行,同样复制其 值 列中的字符(一串较短的字母数字组合)。

4.