利用爬虫下载番剧进行追番

创作背景

  • 最近,本菜鸡找到了一个 网站(网站地址自行前往代码中寻找)😏 ,用来追番呀,下载动漫,电影之类的,但有的动漫没有提供下载功能,所以只能 自己下载了呀😏 (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)

出现的问题

  1. 下载速度于网速有关,我这里就 极其的慢 ,而且请求次数多了,ip 可能会被封(我目前还没遇到),下图仅供参考
    在这里插入图片描述
  2. 其他的没有什么 问题



写在最后

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值