python 爬取某站视频批量下载
import os
import re
import json
import requests
import subprocess
import time
import random
headers = {
"cookie": "buvid3=ACADAEB4-FA24-5CE2-AE7C-BD70F80E50D880539infoc; b_nut=1728711980; _uuid=B1AC691F-343C-7D32-76C5-95AA3D6B8B8B80361infoc; buvid4=3B64CA58-5131-97C9-1C7D-038C13272BC780713-024051511-QCISCSvyYHU9ayAyNiWXAQ%3D%3D; buvid_fp=80b57d7119620b4bc277b5565e70e128; rpdid=|(um~Rlumu~)0J'u~k)~uum)k; enable_web_push=DISABLE; enable_feed_channel=DISABLE; home_feed_column=5; browser_resolution=1707-898; header_theme_version=OPEN; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTI4MTg1MTgsImlhdCI6MTc1MjU1OTI1OCwicGx0IjotMX0.RVJomYln11zknFwQLeLqZdEodaxpxbM24JNvxTVr71s; bili_ticket_expires=1752818458; SESSDATA=b472f2a6%2C1768111391%2C51b5d%2A71; bili_jct=186416a322e3234cb5778e18931f2f0a; DedeUserID=3546644163332127; DedeUserID__ckMd5=8758534914171ba3; sid=76g80rj0; theme-tip-show=SHOWED; theme-avatar-tip-show=SHOWED; b_lsid=D632BB10D_1980D003D59; CURRENT_FNVAL=2000; bp_t_offset_3546644163332127=1089752500006813696",
"referer": "https://space.bilibili.com/517327498/upload/video",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
}
def download_bilibili_video(bvid, output_dir="videos"):
"""下载单个B站视频"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
url = f"https://www.bilibili.com/video/{bvid}"
try:
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
data = response.text
title_match = re.search(r'"title":"(.*?)"', data)
if not title_match:
print(f"⚠️ 标题提取失败: {bvid}")
return False
title = re.sub(r'[\\/:*?"<>|]', "", title_match.group(1))
video_info = re.search(r'<script>window.__playinfo__=(.*?)</script>', data)
if not video_info:
print(f"⚠️ 视频信息提取失败: {bvid}")
return False
json_data = json.loads(video_info.group(1))
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
video_content = requests.get(video_url, headers=headers).content
video_path = os.path.join(output_dir, f"{title}_temp.mp4")
with open(video_path, 'wb') as vf:
vf.write(video_content)
audio_content = requests.get(audio_url, headers=headers).content
audio_path = os.path.join(output_dir, f"{title}_temp.mp3")
with open(audio_path, 'wb') as af:
af.write(audio_content)
output_path = os.path.join(output_dir, f"{title}.mp4")
cmd = ['ffmpeg', '-y', '-i', video_path, '-i', audio_path, '-c', 'copy', output_path]
subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
os.remove(video_path)
os.remove(audio_path)
print(f"✅ 下载完成: {title}.mp4")
return True
except Exception as e:
print(f"❌ 下载失败 {bvid}: {str(e)}")
return False
if __name__ == "__main__":
headers = {
"cookie": "buvid3=ACADAEB4-FA24-5CE2-AE7C-BD70F80E50D880539infoc; b_nut=1728711980; _uuid=B1AC691F-343C-7D32-76C5-95AA3D6B8B8B80361infoc; buvid4=3B64CA58-5131-97C9-1C7D-038C13272BC780713-024051511-QCISCSvyYHU9ayAyNiWXAQ%3D%3D; buvid_fp=80b57d7119620b4bc277b5565e70e128; rpdid=|(um~Rlumu~)0J'u~k)~uum)k; enable_web_push=DISABLE; enable_feed_channel=DISABLE; home_feed_column=5; browser_resolution=1707-898; header_theme_version=OPEN; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTI4MTg1MTgsImlhdCI6MTc1MjU1OTI1OCwicGx0IjotMX0.RVJomYln11zknFwQLeLqZdEodaxpxbM24JNvxTVr71s; bili_ticket_expires=1752818458; SESSDATA=b472f2a6%2C1768111391%2C51b5d%2A71; bili_jct=186416a322e3234cb5778e18931f2f0a; DedeUserID=3546644163332127; DedeUserID__ckMd5=8758534914171ba3; sid=76g80rj0; theme-tip-show=SHOWED; theme-avatar-tip-show=SHOWED; b_lsid=D632BB10D_1980D003D59; CURRENT_FNVAL=2000; bp_t_offset_3546644163332127=1089752500006813696",
"referer": "https://space.bilibili.com/517327498/upload/video",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
}
url = "https://api.bilibili.com/x/space/wbi/arc/search?pn=2&ps=42&tid=0&special_type=&order=pubdate&mid=517327498&index=0&keyword=&order_avoided=true&platform=web&web_location=333.1387&dm_img_list=[%7B%22x%22:4228,%22y%22:-289,%22z%22:0,%22timestamp%22:409096,%22k%22:85,%22type%22:0%7D,%7B%22x%22:4290,%22y%22:-285,%22z%22:52,%22timestamp%22:409196,%22k%22:117,%22type%22:0%7D,%7B%22x%22:4327,%22y%22:-206,%22z%22:101,%22timestamp%22:409297,%22k%22:96,%22type%22:0%7D,%7B%22x%22:4278,%22y%22:-242,%22z%22:59,%22timestamp%22:409406,%22k%22:80,%22type%22:0%7D,%7B%22x%22:4449,%22y%22:-72,%22z%22:233,%22timestamp%22:410004,%22k%22:121,%22type%22:0%7D,%7B%22x%22:4443,%22y%22:-393,%22z%22:137,%22timestamp%22:410104,%22k%22:62,%22type%22:0%7D,%7B%22x%22:4444,%22y%22:-557,%22z%22:104,%22timestamp%22:410205,%22k%22:122,%22type%22:0%7D,%7B%22x%22:4446,%22y%22:-697,%22z%22:118,%22timestamp%22:410311,%22k%22:75,%22type%22:0%7D,%7B%22x%22:4890,%22y%22:-254,%22z%22:565,%22timestamp%22:410458,%22k%22:122,%22type%22:0%7D,%7B%22x%22:4748,%22y%22:-406,%22z%22:453,%22timestamp%22:410559,%22k%22:112,%22type%22:0%7D,%7B%22x%22:4999,%22y%22:-81,%22z%22:758,%22timestamp%22:410659,%22k%22:100,%22type%22:0%7D,%7B%22x%22:4480,%22y%22:-607,%22z%22:260,%22timestamp%22:410764,%22k%22:88,%22type%22:0%7D,%7B%22x%22:4945,%22y%22:-143,%22z%22:728,%22timestamp%22:411355,%22k%22:74,%22type%22:0%7D,%7B%22x%22:4559,%22y%22:-617,%22z%22:284,%22timestamp%22:411455,%22k%22:95,%22type%22:0%7D,%7B%22x%22:4398,%22y%22:-635,%22z%22:108,%22timestamp%22:411555,%22k%22:123,%22type%22:0%7D,%7B%22x%22:5063,%22y%22:233,%22z%22:624,%22timestamp%22:411656,%22k%22:78,%22type%22:0%7D,%7B%22x%22:5156,%22y%22:409,%22z%22:675,%22timestamp%22:411759,%22k%22:126,%22type%22:0%7D,%7B%22x%22:5988,%22y%22:1201,%22z%22:1466,%22timestamp%22:411860,%22k%22:82,%22type%22:0%7D,%7B%22x%22:5361,%22y%22:583,%22z%22:812,%22timestamp%22:411961,%22k%22:98,%22type%22:0%7D,%7B%22x%22:5787,%22y%22:993,%22z%22:1240,%22timestamp%22:412914,%22k%22:65,%22type%22:0%7D,%7B%22x%22:5888,%22y%22:1126,%22z%22:1291,%22timestamp%22:413014,%22k%22:115,%22type%22:0%7D,%7B%22x%22:7895,%22y%22:5475,%22z%22:1723,%22timestamp%22:413116,%22k%22:100,%22type%22:0%7D,%7B%22x%22:6475,%22y%22:5001,%22z%22:639,%22timestamp%22:416419,%22k%22:61,%22type%22:0%7D,%7B%22x%22:5530,%22y%22:2618,%22z%22:2559,%22timestamp%22:416520,%22k%22:70,%22type%22:0%7D,%7B%22x%22:5087,%22y%22:2044,%22z%22:2509,%22timestamp%22:416621,%22k%22:100,%22type%22:0%7D,%7B%22x%22:2284,%22y%22:-899,%22z%22:218,%22timestamp%22:416722,%22k%22:125,%22type%22:0%7D,%7B%22x%22:4383,%22y%22:1216,%22z%22:2867,%22timestamp%22:416824,%22k%22:60,%22type%22:0%7D,%7B%22x%22:2109,%22y%22:-1133,%22z%22:818,%22timestamp%22:416925,%22k%22:105,%22type%22:0%7D,%7B%22x%22:2658,%22y%22:-584,%22z%22:1367,%22timestamp%22:417049,%22k%22:101,%22type%22:0%7D,%7B%22x%22:3557,%22y%22:314,%22z%22:2269,%22timestamp%22:417150,%22k%22:66,%22type%22:0%7D,%7B%22x%22:1972,%22y%22:-1055,%22z%22:542,%22timestamp%22:418847,%22k%22:113,%22type%22:0%7D,%7B%22x%22:4382,%22y%22:1652,%22z%22:1302,%22timestamp%22:419381,%22k%22:69,%22type%22:0%7D,%7B%22x%22:7800,%22y%22:6053,%22z%22:1771,%22timestamp%22:419536,%22k%22:86,%22type%22:0%7D,%7B%22x%22:8412,%22y%22:7995,%22z%22:2694,%22timestamp%22:422721,%22k%22:110,%22type%22:0%7D,%7B%22x%22:6117,%22y%22:5254,%22z%22:518,%22timestamp%22:422823,%22k%22:82,%22type%22:0%7D,%7B%22x%22:7452,%22y%22:6613,%22z%22:1620,%22timestamp%22:422923,%22k%22:76,%22type%22:0%7D,%7B%22x%22:7290,%22y%22:7440,%22z%22:1964,%22timestamp%22:423024,%22k%22:117,%22type%22:0%7D,%7B%22x%22:8751,%22y%22:10154,%22z%22:4174,%22timestamp%22:423137,%22k%22:65,%22type%22:0%7D,%7B%22x%22:5312,%22y%22:6166,%22z%22:2336,%22timestamp%22:428657,%22k%22:67,%22type%22:0%7D,%7B%22x%22:7191,%22y%22:5856,%22z%22:3054,%22timestamp%22:428758,%22k%22:104,%22type%22:0%7D,%7B%22x%22:7427,%22y%22:5111,%22z%22:2760,%22timestamp%22:428859,%22k%22:98,%22type%22:0%7D,%7B%22x%22:5298,%22y%22:2989,%22z%22:633,%22timestamp%22:429001,%22k%22:71,%22type%22:0%7D,%7B%22x%22:5462,%22y%22:2374,%22z%22:1064,%22timestamp%22:429103,%22k%22:113,%22type%22:0%7D,%7B%22x%22:5127,%22y%22:463,%22z%22:673,%22timestamp%22:429203,%22k%22:126,%22type%22:0%7D,%7B%22x%22:5631,%22y%22:1070,%22z%22:1167,%22timestamp%22:429305,%22k%22:99,%22type%22:0%7D,%7B%22x%22:7450,%22y%22:2788,%22z%22:3036,%22timestamp%22:429407,%22k%22:105,%22type%22:0%7D,%7B%22x%22:9196,%22y%22:4485,%22z%22:4676,%22timestamp%22:429507,%22k%22:69,%22type%22:0%7D,%7B%22x%22:6396,%22y%22:1643,%22z%22:1864,%22timestamp%22:429608,%22k%22:65,%22type%22:0%7D,%7B%22x%22:8042,%22y%22:3275,%22z%22:3506,%22timestamp%22:429709,%22k%22:71,%22type%22:0%7D,%7B%22x%22:4643,%22y%22:-122,%22z%22:101,%22timestamp%22:429818,%22k%22:83,%22type%22:0%7D]&dm_img_str=V2ViR0wgMS4wIChPcGVuR0wgRVMgMi4wIENocm9taXVtKQ&dm_cover_img_str=QU5HTEUgKEludGVsLCBJbnRlbChSKSBVSEQgR3JhcGhpY3MgKDB4MDAwMEE3OEIpIERpcmVjdDNEMTEgdnNfNV8wIHBzXzVfMCwgRDNEMTEpR29vZ2xlIEluYy4gKEludGVsKQ&dm_img_inter=%7B%22ds%22:[%7B%22t%22:7,%22c%22:%22dnVpX2J1dHRvbiB2dWlfcGFnZW5hdGlvbi0tYnRuIHZ1aV9wYWdlbmF0aW9uLS1idG4tc2lkZQ%22,%22p%22:[5857,73,6399],%22s%22:[153,521,570]%7D],%22wh%22:[5477,6019,89],%22of%22:[3203,4356,128]%7D&w_webid=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcG1faWQiOiIzMzMuMTM4NyIsImJ1dmlkIjoiQUNBREFFQjQtRkEyNC01Q0UyLUFFN0MtQkQ3MEY4MEU1MEQ4ODA1MzlpbmZvYyIsInVzZXJfYWdlbnQiOiJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTM4LjAuMC4wIFNhZmFyaS81MzcuMzYiLCJidXZpZF9mcCI6IjgwYjU3ZDcxMTk2MjBiNGJjMjc3YjU1NjVlNzBlMTI4IiwiYmlsaV90aWNrZXQiOiJleUpoYkdjaU9pSklVekkxTmlJc0ltdHBaQ0k2SW5Nd015SXNJblI1Y0NJNklrcFhWQ0o5LmV5SmxlSEFpT2pFM05USTRNVGcxTVRnc0ltbGhkQ0k2TVRjMU1qVTFPVEkxT0N3aWNHeDBJam90TVgwLlJWSm9tWWxuMTF6a25Gd1FMZUxxWmRFb2RheHB4Yk0yNEpOdnhUVnI3MXMiLCJjcmVhdGVkX2F0IjoxNzUyNTY1NzQxLCJ0dGwiOjg2NDAwLCJ1cmwiOiIvNTE3MzI3NDk4Lz9zcG1faWRfZnJvbT0zMzMuNzg4LnVwaW5mby5oZWFkLmNsaWNrIiwicmVzdWx0IjowLCJpc3MiOiJnYWlhIiwiaWF0IjoxNzUyNTY1NzQxfQ.e4q4tv_2fYEksYsrsc3KFyxumf51uNENQeoQ6aVRlEkOlcp769lv6snNxksQx4WHxUWagjOlBLWnCLAm9bQpkMcLutBA8_7ocx9_L6FQxRX3fDREgqd-Viltn5wNnnvI5XOm3txzDnHSwgYD6xvlCgAzLkB2ywbUhnHOsboF5fBX3ka8XF1afmDO1nYq9AHQYRQhtaxNlB1qQWeUClFlOlB_V70RUqSzvTraj7zJcJuGsON_-4EgStPWptWEd61je7_xPpkeH-i92V03lpePBarRHN9t2zEexwmgR4Sn2XOuKEFA1Q0hE1rCAH9OcxfoCbkCC5xTUDtNZIExSF0hMw&w_rid=ec93d79c4b24a3341100afe12aaffb10&wts=1752566175"
response = requests.get(url, headers=headers)
data = response.json()
bvid_list = []
if data['code'] == 0:
for video in data['data']['list']['vlist']:
bvid_list.append(video['bvid'])
for bvid in bvid_list:
print(f"\n▷ 开始下载: {bvid}")
download_bilibili_video(bvid)
delay = random.uniform(3, 8)
time.sleep(delay)
print("\n所有任务处理完毕!")