目录
一、效果呈现
封面
源代码
二、讲解
1. 发送请求获取数据
首先,我们需要向B站的API发送请求以获取视频数据:
import os
import requests
import json
# B站排行榜API的URL
url = 'https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all'
# 伪装成浏览器访问,防止被拒绝
headers = {
'Referer': 'https://www.bilibili.com/v/popular/rank/all/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送GET请求
response = requests.get(url, headers=headers)
# 解析响应的JSON数据
data = response.json()
2. 创建目录
接下来,我们将创建两个目录来保存封面图片和源代码文件:
# 创建封面图片目录
if not os.path.exists('封面'):
os.makedirs('封面')
# 创建源代码目录
if not os.path.exists('源代码'):
os.makedirs('源代码')
3. 遍历视频数据并保存封面和源代码
现在,我们将遍历获取到的视频数据,下载封面图片并保存源代码:
# 遍历前100个视频
for i, video in enumerate(data['data']['list'][:100], 1):
# 封面图片的URL
cover_url = video['pic']
# 视频的ID
video_id = video['aid']
# 封面图片的保存路径
cover_path = f'封面/{video_id}.jpg'
# 下载并保存封面图片
try:
with open(cover_path, 'wb') as f:
f.write(requests.get(cover_url).content)
print(f'已保存第 {i} 个视频封面:{cover_path}')
except Exception as e:
print(f'第 {i} 个视频封面保存失败:{e}')
# 保存源代码到HTML文件
with open(f'源代码/AV{video_id}.html', 'w', encoding='utf-8') as f:
f.write(json.dumps(video, ensure_ascii=False))
4. 完成信息
最后,打印一条消息表示所有操作已完成:
print('所有视频封面和源代码都已保存完成。')
三、完整代码
import os
import requests
import json
url = 'https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all'
headers = {
'Referer': 'https://www.bilibili.com/v/popular/rank/all/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
data = response.json()
if not os.path.exists('封面'):
os.makedirs('封面')
if not os.path.exists('源代码'):
os.makedirs('源代码')
for i, video in enumerate(data['data']['list'][:100], 1):
cover_url = video['pic']
video_id = video['aid']
cover_path = f'封面/{video_id}.jpg'
try:
with open(cover_path, 'wb') as f:
f.write(requests.get(cover_url).content)
print(f'已保存第 {i} 个视频封面:{cover_path}')
except Exception as e:
print(f'第 {i} 个视频封面保存失败:{e}')
with open(f'源代码/AV{video_id}.html', 'w', encoding='utf-8') as f:
f.write(json.dumps(video, ensure_ascii=False))
print('所有视频封面和源代码都已保存完成。')