创作背景
-
最近,本菜鸡找到了一个 网站(网站地址自行前往代码中寻找)😏 ,用来追番呀,下载动漫,电影之类的,但有的动漫没有提供下载功能,所以只能 自己下载了呀😏 (dddd)
-
目前 demo 已经做出来了,本篇博文将上传具体代码
-
但还没有封装完成,还有诸多想实现的功能还没有实现如
- 多线程搜索(已实现)
- 想 利用 redis,搞个多线程下载,(别问我为啥不用 scrapy,因为 我想自己实现😜,即使我很菜)
- 如果以后学了就 搞个 GUI
- 等等等等…
代码逻辑
- 先 使用函数 search 获得想要下载的番剧的名称及主页
- 然后 利用函数 get_video_url 获得每一集视频的播放页链接
- 最后 利用函数 download_video 下载视频并保存到指定路径
代码实现
- 下面上正餐
# -*- coding=utf-8 -*-
# @Author : lhys
# @FileName: demo.py
import requests
import lxml.etree as le
import re
import os
import time
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
major_url = 'https://www.dytt.com'
def search(kw):
'''
本函数用来搜索关键词,并由用户选择要下载的视频
:param kw: 要搜索的关键词
:return: 选择后的视频的简介页的链接
'''
url = 'https://www.dytt.com/vodsearch/-------------.html?wd=%s' % kw
req = requests.get(url, headers = headers).text
result = []
print('{:2s}: {:^30s} {:^50s} {:^10s}'.format('序号', '搜索结果名称', '搜索结果类型', '上映时间'))
for i, uc in enumerate(le.HTML(req).xpath('//tr')[1:]):
name = uc.xpath('./td[1]/a/text()')[0]
url = major_url + uc.xpath('./td[1]/a/@href')[0]
type = uc.xpath('./td[2]/text()')[0] if len(uc.xpath('./td[2]/text()')) != 0 else ''
time = uc.xpath('./td[5]/text()')[0]
result.append(
{
'name' : name,
'url' : url
}
)
print('{:>2d}: {:^30s} {:^50s} {:^10s}'.format(i + 1, name, type, time))
# print('%d: %s\t%s' % (i + 1, name, type))
choose = eval(input('请选择要下载的视频序号:')) - 1
return result[choose]
def get_video_url(url_dict):
'''
本函数用来获得每个视频的播放页
:param url: 视频的简介页的链接
:return: 每个视频播放页的的链接
'''
name = url_dict['name']
result = {name : []}
url = url_dict['url']
req = requests.get(url, headers = headers).text
video_list = le.HTML(req).xpath('//ul[@class="bofangListUl"]/li/a')
for video in video_list:
url = major_url + video.xpath('./@href')[0]
v_name = video.xpath('./text()')[0]
result[name].append(
{
'name' : name + v_name,
'url' : url
}
)
return result
def download_video(r_dict, f_path = '.'):
'''
本函数用来下载视频
:param r_list: 包含视频链接
:return: None
'''
for name in r_dict.keys():
print(name)
r_list = r_dict.get(name)
path = os.path.join(f_path, name)
if not os.path.exists(path):
os.mkdir(path)
for r in r_list:
if os.path.exists(os.path.join(path, r.get('name')) + '.mp4'):
continue
print('%s 正在下载...' % r.get('name'))
url = r.get('url')
req = requests.get(url, headers = headers).text
pattern = '"url":"(.*?)"'
v_file_url = re.findall(pattern, le.HTML(req).xpath('//div[@class="pageMainTop20"]//script/text()')[0])[0].replace('\\', '')
# print(v_file_url)
m_url = re.findall('(https://.*?)/index.m3u8', v_file_url)[0]
# print(m_url)
file_c = requests.get(url = v_file_url, headers = headers).text.split()[-1]
# print(file_c)
u1 = re.findall('(.*?)/index.m3u8', file_c)[0]
url2 = m_url + '/' + file_c
req2 = requests.get(url2).text.split()[5::2]
length = len(req2)
start_time = time.perf_counter()
for i, file in enumerate(req2):
file_url = m_url +'/' + u1 + '/' + file
while True:
try:
file_req = requests.get(file_url, headers = headers)
break
except:
time.sleep(1.3)
continue
# 将视频文件拼接
with open(os.path.join(path, r.get('name')) + '.mp4', 'ab') as f:
f.write(file_req.content)
# 进度条
x = (i / length) * 100
count = int(i / length * 20)
y = '■' * count
z = '□' * (20 - count)
print("\r{:^3.0f}%[{}{}] {:.3f}s".format(x, y, z, time.perf_counter() - start_time), end = "")
time.sleep(1)
f_time = time.perf_counter() - start_time
print("\r{:^3.0f}%[{}] {:.3f}s".format(100.00, '■' * 20, f_time))
with open('./time.log', 'a') as f:
f.write(r.get('name') + '下载完毕,所用时间:' + '\t' + str(f_time) + 's\n')
print('%s 已经下载完毕...\n' % r.get('name'))
kw = input('请输入要搜索的关键词')
file_path = input('请输入保存地址:').replace('\\', '')
r_dict = get_video_url(search(kw))
download_video(r_dict, file_path)
出现的问题
- 下载速度于网速有关,我这里就 极其的慢 ,而且请求次数多了,ip 可能会被封(我目前还没遇到),下图仅供参考
- 其他的没有什么 大 问题
写在最后
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。