|
@@ -0,0 +1,91 @@
|
|
|
|
+# @Author : @Cloudmistery
|
|
|
|
+
|
|
|
|
+"""
|
|
|
|
+tips:错误记录
|
|
|
|
+1.headers请求头设置错误导致文件不可读(就是错了)
|
|
|
|
+2.文件名合法化,不合法的文件名直接创建不了
|
|
|
|
+3.音频和视频需要分开爬取及合成
|
|
|
|
+"""
|
|
|
|
+
|
|
|
|
+# 请求模块
|
|
|
|
+import requests
|
|
|
|
+# 正则模块
|
|
|
|
+import re
|
|
|
|
+# json模块
|
|
|
|
+import json
|
|
|
|
+# 合并模块
|
|
|
|
+from moviepy.editor import *
|
|
|
|
+# html
|
|
|
|
+import html as h
|
|
|
|
+
|
|
|
|
+# TODO:修改url和cookie,爬不到最高画质的主要原因就是没有更新cookie
|
|
|
|
+
|
|
|
|
+# 设置
|
|
|
|
+url = 'https://www.bilibili.com/video/BV1J24y1p75G/?buvid=Y84DF68249678902447EA7D8C8D4E12E9DDC&from_spmid=search.search-result.0.0&is_story_h5=false&mid=VRgCQHIxfkYie40eSwgBqQ%3D%3D&plat_id=114&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=37ACC364-AFB3-49B2-AE6D-ECDDEE498D3B&share_source=WEIXIN&share_tag=s_i×tamp=1737513904&unique_k=JBOVMFJ&up_id=690032002&vd_source=f6247aa12dae1ff1bce74ef0af381757'
|
|
|
|
+A_path = 'Audio/'
|
|
|
|
+V_path = 'Video/'
|
|
|
|
+
|
|
|
|
+# Synth_path = 'File/美少女/'
|
|
|
|
+Synth_path = 'File/'
|
|
|
|
+
|
|
|
|
+headers = {
|
|
|
|
+ 'Referer': url,
|
|
|
|
+ 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
|
|
|
|
+ 'cookie': "buvid3=94F0FDAB-59F7-39B1-F805-CAA3E07060F661671infoc; b_nut=1729338061; _uuid=96637C82-967A-B8CA-D643-7621093B83AF862008infoc; buvid4=6F50A1B3-D6A1-87A5-1EF3-7AA396E5E35C62385-024101911-WqlszYIbsE%2BQ%2FFD68EQkXA%3D%3D; enable_web_push=DISABLE; LIVE_BUVID=AUTO8117293380854336; header_theme_version=CLOSE; rpdid=|(Y|RJYumR|0J'u~kmJJmJ)u; buvid_fp_plain=undefined; hit-dyn-v2=1; is-2022-channel=1; fingerprint=19cfe92f609986680aa1f2f4ffaa5e5d; PVID=1; DedeUserID=35990046; DedeUserID__ckMd5=bf34a8eab39f0c11; buvid_fp=19cfe92f609986680aa1f2f4ffaa5e5d; blackside_state=1; CURRENT_BLACKGAP=1; CURRENT_QUALITY=80; enable_feed_channel=DISABLE; _tea_utm_cache_20001731={%22creative_id%22:209057374}; CURRENT_FNVAL=4048; b_lsid=F36DB5DB_194D3DCC6B3; bmg_af_switch=1; bmg_src_def_domain=i1.hdslb.com; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mzg5ODA0NDksImlhdCI6MTczODcyMTE4OSwicGx0IjotMX0.lcIqSpCGaiPjRY0RAbCO8tOzHdF-VFiDMC-TWAiwIcE; bili_ticket_expires=1738980389; SESSDATA=de21e156%2C1754273250%2C4e042%2A21CjBcyUNyR_qeZY9ycuob2AZJmLM-9fFaPpMpNuKQmHWOenW-tp_d3fn8MLTp_YJhwzESVjFKbXVnLVdFS3d1djZyMU1zcE96UnNYWDVqazBrRk9sZUY4aVVETVY2THNpRVhOQVEzVEx2X2ZCTjdwdkpIazIzWThFTFk3SDV5NGpfLWxOWXQxTWVnIIEC; bili_jct=fdb20597a08eb5fe5869f1b5d45b85b6; sid=qk2ukeq5; bp_t_offset_35990046=1030289008506175488; home_feed_column=4; browser_resolution=1274-920"
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+# 主程序
|
|
|
|
+# 发送请求
|
|
|
|
+response = requests.get(url=url, headers=headers,timeout=(3,7))
|
|
|
|
+html = response.text
|
|
|
|
+
|
|
|
|
+# 提取,合法化字符并显示 视频标题
|
|
|
|
+title = re.findall('title="(.*?)"', html)[0]
|
|
|
|
+title = h.unescape(title)
|
|
|
|
+
|
|
|
|
+if title:
|
|
|
|
+ illegal_chars = fr'<||>\/:"*?'
|
|
|
|
+ def remove_illegal_chars(title_ill):
|
|
|
|
+ for char in illegal_chars:
|
|
|
|
+ title_ill = title_ill.replace(char, " ")
|
|
|
|
+ return title_ill
|
|
|
|
+ title = remove_illegal_chars(title)
|
|
|
|
+print("视频标题:",title)
|
|
|
|
+
|
|
|
|
+# 提取视频信息,提取音视频链接
|
|
|
|
+# # TODO:设置数值来声明文件品质,0默认最高
|
|
|
|
+info = re.findall('window.__playinfo__=(.*?)</script>', html)[0]
|
|
|
|
+json_data = json.loads(info)
|
|
|
|
+video_url = json_data['data']['dash']['video'][0]['baseUrl']
|
|
|
|
+audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
|
|
|
|
+
|
|
|
|
+# 获取音视频内容并保存
|
|
|
|
+video_content = requests.get(url=video_url, headers=headers).content
|
|
|
|
+audio_content = requests.get(url=audio_url, headers=headers).content
|
|
|
|
+def SaveAudio():
|
|
|
|
+ with open(A_path + title + '.mp3', mode='wb') as a:
|
|
|
|
+ a.write(audio_content)
|
|
|
|
+def SaveVideo():
|
|
|
|
+ with open(V_path + title + '.mp4', mode='wb') as v:
|
|
|
|
+ v.write(video_content)
|
|
|
|
+
|
|
|
|
+def ClipVideo():
|
|
|
|
+ time_1 = 0
|
|
|
|
+ time_2 = None
|
|
|
|
+ audio_path = fr"{A_path}{title}{'.mp3'}"
|
|
|
|
+ video_path = fr"{V_path}{title}{'.mp4'}"
|
|
|
|
+ audio = AudioFileClip(audio_path)
|
|
|
|
+ audio_clip = audio.subclip(time_1, time_2)
|
|
|
|
+ video = VideoFileClip(video_path)
|
|
|
|
+ video_clip = video.subclip(time_1, time_2)
|
|
|
|
+ audio_clip = audio_clip.set_duration(video_clip.duration)
|
|
|
|
+ video_clip_with_audio = video_clip.set_audio(audio_clip)
|
|
|
|
+ video_clip_with_audio.write_videofile(fr"{Synth_path}{title}{'.mp4'}", codec="libx264", audio_codec="aac")
|
|
|
|
+
|
|
|
|
+def main():
|
|
|
|
+ SaveAudio()
|
|
|
|
+ # SaveVideo()
|
|
|
|
+ # ClipVideo()
|
|
|
|
+
|
|
|
|
+if __name__ == '__main__':
|
|
|
|
+ main()
|