写在前面

在使用和分享此爬虫代码时,请务必遵守以下限制和建议,并减少对目标服务器的负担:

  1. 遵循网站规定: 请始终遵循被爬取网站的使用条款、隐私政策以及robots.txt文件中的规定。不得违反网站规定的任何规则。

  2. 合法用途: 此爬虫代码仅用于合法、合理的用途,如数据收集、分析或学术研究等。不得将其用于非法用途,包括但不限于侵犯隐私、版权或其他法律权益。

  3. 适度请求频率: 设置合理的请求频率,避免对目标服务器造成过度负担。频繁的请求可能导致被封禁或其他限制。

  4. 尊重隐私: 不得通过爬虫获取或传播任何用户敏感信息。请尊重被爬取网站和用户的隐私权。

  5. 不要滥用资源: 避免滥用带宽和其他资源。在下载大量数据时,谨慎使用服务器资源,以确保公平共享和减少不必要的开销。

  6. 不要绕过登录限制: 不得通过绕过网站的登录限制或其他访问控制机制,以确保不违反网站的安全策略。

请注意,违反这些限制可能会导致法律责任,打击作者的热情,对爬虫作者和使用者都会产生负面影响。在使用和分享爬虫代码时,请谨慎考虑其合法性和合规性,以维护互联网的健康和稳定。

使用说明

  1. 有一定的python基础。
  2. 知道如何获取自己的Cookie
  3. 已经安装了相关库,配置好了相关环境

RequestUrl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from random import uniform
from requests import get
from time import sleep
import os

def get_url(url,cookie='',Referer='https://www.bilibili.com/'):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
'Referer':Referer,
'Origin':'https://www.bilibili.com',
'Cookie': cookie #填你自己的
}
try:
response = get(url, headers=headers, timeout=3)
sleep(uniform(1, 2))
return response
except Exception as error:
print(f"{url} 请求发生错误: {error}\n")
if os.path.exists('.\\log') == False:
os.makedirs('.\\log')
with open(".\\log\\error.txt", mode='a') as f:
f.write(f"{url} 请求发生错误: {error}\n")
return 0

b站专栏视频爬取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

import os
import subprocess
import time
from RequestUrl import get_url
import re
import json
from lxml import etree



def get_infor(url):
resp = get_url(url)
base_url = url.split('?')[0] + '?p='
pages = '{' + re.findall('"pages":\[.*?]',resp.text,re.S)[0] + '}'
pages = json.loads(pages)
html = etree.HTML(resp.text)
name = html.xpath('/html/body/div[2]/div[2]/div[1]/div[1]/h1/text()')[0]
name = re.sub(r'\W+', '', name).replace('_', '')
if os.path.exists(f'.\\{name}')==False:
os.makedirs(f'.\\{name}')

remove = []
for i in pages['pages']:
title = i['part']
remove.append(title)
page_url = base_url + str(i['page'])

print(page_url,title)
download(page_url,title,name)

print(f'{i["page"]} is ok!')
time.sleep(1)

for i in remove:
Clear_down(i,name)




def download(page_url,title,name):

response = get_url(page_url)
result = re.findall(r'<script>window.__playinfo__=(.*?)</script>', response.text)[0]
data = json.loads(result)
# 获取音频和视频的URL
# print(data)
audio_url = data['data']['dash']['audio'][0]['baseUrl']
video_url = data['data']['dash']['video'][0]['baseUrl']

with open(f'.\\{name}\\{title}' + '.mp3', mode='wb') as f:
audio_content = get_url(url=audio_url).content
f.write(audio_content)
print('音频下载完成')

with open(f'.\\{name}\\{title}' + '.mp4', mode='wb') as f:
video_content = get_url(url=video_url)
f.write(video_content.content)
print(f'视频下载完成')

print('下载完成,正在为你合成文件')

merge_command = f'ffmpeg -loglevel quiet -i .\\{name}\\{title}.mp4 -i .\\{name}\\{title}.mp3 -c:v copy -c:a aac -strict experimental .\\{name}\\{title}output.mp4'
subprocess.run(merge_command, shell=True)
print('音视频合并完成')




def Clear_down(title,name):
os.remove(f'.\\{name}\\{title}.mp4')
os.remove(f'.\\{name}\\{title}.mp3')

未使用多线程爬取,当分批视频特别多的时候爬取效率低下。
可以使用我的多线程模板加快速度。

其中download适用于b站大多数视频的下载。title为下载文件的文件名,name为将下载好的文件放到名为name的文件夹下。方便后续管理。

像是拜年祭类似的视频,使用download是无法下载的,那个涉及到w_rid的解密