本帖最后由 szsnk144864 于 2022-12-8 12:37 编辑
自用的一个 python 爬虫代码,想到当初我就看了一点教程,就硬着头皮来写,不断的到52大家庭里来问,模仿,
到现在会写一点爬虫,想把自己的代码分享出来,给那些刚学的伙伴们一点点指引(大佬勿喷啊)
自己也还在不断学习中,希望有大佬可以对代码进行一点指点
下载的时候尽量把线程调小一点,对网站温柔一点哈
本代码仅供学习交流,如作他用所承受的责任一概与我无关
[Python] 纯文本查看 复制代码 import time
import requests
import base64
import re
from H_m3u8DL import m3u8download
'''
这是我的思路,小白一枚,希望大佬多多指点,♪(・ω・)ノ
1.首先获取网站源代码 >>> response
2.接着获取播放视频的链接 >>> video_json 并进行组合,得到完整链接 >>>url_value
3.将获取播放视频的 m3u8 地址,得到一个加密 m3u8 >>> base64_str
4.然后将加密的 m3u8 文件解密,得到最终得到未加密的 m3u8 下载链接 >>> m3u8_true_url
5.最后通过 m3u8 下载工具,或者 python 里的 m3u8下载(需要先pip install H_m3u8DL)
注意!
下载视频的时候尽量别把线程数调大,对网站温柔一点
'''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
}
def get_video_m3u8(url):
# 获取源网页代码
response = requests.get(url=url, headers=headers)
# 通过获取 var play = {} 数据,得到新的视频链接后面部分,得到的数据有双引号,加上eval,就可以去除双引号,我是这么理解的,O_o
video_json = eval(re.findall((r'var player_aaaa=(.*?)</script><script type='), (response.text), re.I)[0])
# 获取视频名称
video_name = video_json.get('vod_data').get('vod_name') + " 第" + str(video_json.get('nid')) + '集'
# 将得到的字符串进行组合,得到完整的真实网页视频播放界面
url_value = f"https://www.ysgc.vip/static/player/dplayer.php?url={video_json.get('url')}"
# 获取真实网页里的 URL 加密数据,后面解密就可以得到m3u8文件了
base64_str = re.findall('(?<!//)var urls = (.*?);', (requests.get(url=url_value, headers=headers)).text, re.I)[0]
# 解密 [14:-8] 的意思是删除前面14个字符,和后面8个字符
m3u8_true_url = (base64.b64decode(base64_str.encode()))[14:-8].decode('utf-8')
response.close()
# 下面这一步,其实我也不理解为啥这样做,但是不这么做就会报错,O_o
return video_name, m3u8_true_url
def download_video(url, path):
# 获取得到的 m3u8 链接和视频名称
title, m3u8url = get_video_m3u8(url)
# m3u8 下载器,按住键盘 Ctrl键并鼠标点击 m3u8download ,可以对 m3u8 下载器调整
m3u8download(m3u8url, title=title, work_dir=str(path))
# 分析视频播放页面链接,通过 for 循环,将所有集数进行下载
for lv in range(1, 481):
# f 后面的地址就是视频播放页面地址
download_video(f'https://www.ysgc.vip/vodplay/323-4-{lv}.html', ('K:/新建文件夹/动漫/蜡笔小新/蜡笔小新第一季/'))
print('>>>>>>>>>>>>>>>>>>> ' + '第 ' + str(lv) + ' 集写入完成!' + '\n')
time.sleep(10)
|