精华内容
下载资源
问答
  • 经常会有朋友让我推荐一些好用的软件,因此我打算写一篇博客来介绍一下这些我认为爱不释手的软件

    作者简介

    • 作者:LuciferLiu,中国DBA联盟(ACDU)成员。
    • 目前从事Oracle DBA工作,曾从事 Oracle 数据库开发工作,主要服务于生产制造,汽车金融等行业。
    • 现拥有Oracle OCP,OceanBase OBCA认证,擅长Oracle数据库运维开发,备份恢复,安装迁移,Linux自动化运维脚本编写等。

    前言

    经常会有朋友让我推荐一些好用的软件,因此我打算写一篇博客来介绍一下这些我认为爱不释手的软件:

    🔥 排名不分先后,提升电脑使用舒适度100倍的21款软件🔥:
    注意:软件合集下载方式请跳转文末。

    软件介绍

    火绒

    作为一款安全软件,火绒算是国内的一股清流(他们官网的口号是:强悍、 轻巧、 干净),没有广告、弹窗等骚扰用户的行为,而且火绒还关停了流量业务,也赢来了好的口碑。
    火绒

    IDM

    IDM(Internet Download Manager)是国外优秀下载工具,可提升下载速度(最多可达5倍),能安排下载计划,或续传下载一半的下载软件。IDM简体中文特别版,安装后免序列号即为注册版。配合浏览器插件使用,堪称神器。
    IDM

    Bandizip for Windows

    对于解压缩软件,大部分人用的都是WinRAR,我以前也是。但是有一个问题是:广告太多。而Bandizi作为一款免费无广告文件压缩/解压缩工具软件,完全可以替代WinRAR和7-ZIP。
    Bandizip

    Geek Uninstaller

    Geek Uninstaller是一个免费的专业卸载软件,体积小巧,但是拥有出众的功能,帮助用户卸载软件无残留,也不影响系统的运行速度,还有强制卸载功能。软件界面简单,清除速度快,使用简单,自带多国语言文件。
    Geek Uninstaller

    PotPlayer

    PotPlayer软件内置硬件加速解码,方便快捷,安装后可观看任何格式视频文件,功能非常强大。PotPlayer播放器启动速度快,播放稳定,还支持给视频加字幕,设置个性皮肤。体积小巧、界面简洁、功能强大,没有任何广告和垃圾信息,是本地视频播放器的最佳不二之选。
    PotPlayer

    元气壁纸

    元气壁纸是一款专为年轻人打造的动静态壁纸及桌面美化的电脑应用软件。内置游戏渲染引擎,真实还原雨雪光特效和各种粒子效果,让动态壁纸效果栩栩如真,每张壁纸内置专属背景音和鼠标效果,为你打造桌面壁纸的绝美盛宴。桌面整理助手:智能识别文件,一键分类整理,个性设计排版,壁纸自动切换。
    元气壁纸

    Microsoft Edge

    Microsoft Edge浏览器是微软与Win10同步推出的一款新版浏览器,标志着IE时代正式结束。Microsoft Edge浏览器改进了IE时代的所有不足,在安全性上较IE更胜一筹。Edge浏览器在最新的Windows 10预览版上已经支持,交互界面更加简洁,还将兼容现有Chrome与Firefox两大浏览器的扩展程序。
    Edge

    Everything Toolbar

    Everything Toolbar 是一款适用于 Windows 10 的系统辅助工具,它能用 Everything 的搜索框替代 Windows 10 任务栏搜索框,让搜索更方便。
    Everything

    Memreduct

    MemReduct官方版是一款非常受欢迎的内存整理神器,MemReduct官方版体积小巧、启动速度快速,十分轻巧且占用内存极少,但功能非常强大,拥有专业而易用的硬件检测,能够有效清理多余内存。
    Memreduct

    Ditto

    Ditto 是一款开源、免费、强大的剪贴板增强工具。可以把复制过的所有内容保存起来(可以设定保存日期或条目总数),快捷地供后续调用。还可以合并粘贴,纯文本粘贴,支持分组、置顶、快速搜索、热键粘贴功能。并且,还可以通过网络共享剪贴板内容。
    Ditto

    ShareX

    别人有的我都有,ShareX 是开源的高级截图工具和屏幕记录器。使用 ShareX,只需要一个快捷键就可以保存截图到你的粘贴板,硬盘或者上传到 40 不同的文件存储服务上。ShareX 的插件还可以上传图片,文本文件和其他各种文件类型。
    ShareX

    Windows10优化工具

    通过Windows10优化工具可以方便的修改Windows中的配置项,做到一键开启或者关闭。
    Windows10优化工具

    AutoDarkMode

    Auto Dark Mode(WIN10主题自动切换)是一款能够自动帮助用户随着时间自动切换电脑主题的软件,使用软件后用户的win10系统会随着时间的变化,不断自动切换当前的主题,有需要的可以下载使用。
    AutoDarkMode

    全能格式转换器

    全能格式转换器可以随时随地观看、下载、编辑、转换、刻录视频,无论您选择哪一项操作,其最终的结果都将是非常完美的(即使在Utrla HD,3D或VR),不会丢失关键帧。转换速度是市面同类产品的30倍!操作简便,支持158种常见视频格式无损转换,兼具网络视频下载,视频剪辑及DVD刻录等多功能于一身,更有内置播放器让您畅享完美视觉体验!
    全能格式转换器

    win10切换版本

    win10切换版本工具支持任意切换操作系统版本。
    切换版本

    Office Tool Plus

    Office Tool Plus 基于 Office 部署工具 (ODT) 打造,可以很轻松地部署 Office。无论你是个体还是团队,Office Tool Plus 都是您的 Office 小助手。
    Office Tool Plus

    空文件夹删除器(Empty Folder Finder)

    强迫症专用。有时候系统中存在的很多空的文件夹,虽然不占空间,但是会影响到搜索的速度,通过空文件夹删除器可以快速找出并删除他们。
    Empty Folder Finder

    QuickLook Windows

    macOS 上有一个「Quick Look」功能,在文件或者文件夹上按下空格键,就可以快速预览到文件的内容或者资料了。在 Windows 上没有这种功能,虽然说资源管理器里还有其他类似的功能,但使用效率便捷性来说远远比不上这个。不过现在 Windows 下有 QuickLook 这个小工具,也一样可以实现上面的功能。
    quicklook

    Clover

    Clover中文版是一款非常小巧,便捷实用的窗口标签化工具。Clover中文版是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能。Clover中文版功能强大,操作简单,打开我的电脑可以像浏览器一样,将CDE盘标签化在一个窗口里面非常方便,不用再打开E盘后再返回退到D盘啦。
    Clover

    Notepads

    Notepads是Windows平台下一款开源简约轻量级文本编辑器,作者开发之初是想做一个win32记事本的替代品,流利的设计,内置标签系统,速度快得惊人,重量轻得惊人!
    Notepads


    本次分享到此结束啦~

    软件获取方式:
    • 关注公众号 Lucifer三思而后行 自动获取
    • 私信回复 :windows必备软件

    如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

    技术交流可以 关注公众号:Lucifer三思而后行

    展开全文
  • Python 批量下载BiliBili视频 打包成软件

    万次阅读 多人点赞 2020-03-08 20:31:11
    B站是一个神奇的地方,有动画、番剧,还有游戏、鬼畜,更有为广大程序猿所喜爱的科技和编程教学视频,课时你也许会为怎么下载保存下这些视频而发愁,我也遇到了这样的烦恼,于是利用强大的Python进行一番探索,实现...

    如有需要购买用于个人或公司使用的小伙伴可选择百度云或者华为云服务器,点击华为云服务器优惠链接或扫描下方二维码即可享受采购季优惠价:
    华为云采购季专属二维码

    一、项目概述

    1.项目背景

    有一天,我突然想找点事做,想起一直想学但是没有学的C语言,就决定来学一下。
    可是怎么学呢?看书的话太无聊,报班学呢又快吃土了没钱,不如去B站看看?
    果然,关键字C语言搜索,出现了很多C语言的讲课视频:
    C语言讲课视频节选
    B站https://www.bilibili.com/是一个很神奇的地方,简直就是一个无所不有的宝库,几乎可以满足你一切的需求和视觉欲。不管你是想看动画、番剧 ,还是游戏、鬼畜 ,亦或科技和各类教学视频 ,只要你能想到的,基本上都可以在B站找到。对于程序猿或即将成为程序猿的人来说,B站上的编程学习资源是学不完的,可是B站没有提供下载的功能,如果想保存下载在需要的时候看,那就是一个麻烦了。我也遇到了这个问题,于是研究怎么可以实现一键下载视频,最终用Python这门神奇的语言实现了。

    2.环境配置

    这次项目不需要太多的环境配置,最主要的是有ffmpeg(一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序)并设置环境变量就可以了。ffmpeg主要是用于将下载下来的视频和音频进行合并形成完整的视频。

    下载ffmpeg

    可点击https://download.csdn.net/download/CUFEECR/12234789或进入官网http://ffmpeg.org/download.html进行下载,并解压到你想保存的目录。

    设置环境变量

    • 复制ffmpeg的bin路径,如xxx\ffmpeg-20190921-ba24b24-win64-shared\bin
    • 此电脑右键点击属性,进入控制面板\系统和安全\系统
    • 点击高级系统设置→进入系统属性弹窗→点击环境变量→进入环境变量弹窗→选择系统变量下的Path→点击编辑点击→进入编辑环境变量弹窗
    • 点击新建→粘贴之前复制的bin路径
    • 点击确定,逐步保存退出
      动态操作示例如下:
      ffmpeg 设置环境变量

    除了ffmpeg,还需要安装pyinstaller库用于程序打包。
    可用以下命令进行安装:

    pip install pyinstaller
    

    如果遇到安装失败或下载速度较慢,可换源:

    pip install pyinstaller -i https://pypi.doubanio.com/simple/
    

    二、项目实施

    1.导入需要的库

    import json
    import os
    import re
    import shutil
    import ssl
    import time
    import requests
    from concurrent.futures import ThreadPoolExecutor
    from lxml import etree
    

    导入的库包括用于爬取和解析网页的库,还包括创建线程池的库和进行其他处理的库,大多数都是Python自带的,如有未安装的库,可使用pip install xxx命令进行安装。

    2.设置请求参数

    # 设置请求头等参数,防止被反爬
    headers = {
        'Accept': '*/*',
        'Accept-Language': 'en-US,en;q=0.5',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
    }
    params = {
        'from': 'search',
        'seid': '9698329271136034665'
    }
    

    设置请求头等参数,减少被反爬的可能。

    3.基本处理

    def re_video_info(text, pattern):
        '''利用正则表达式匹配出视频信息并转化成json'''
        match = re.search(pattern, text)
        return json.loads(match.group(1))
    
    
    def create_folder(aid):
        '''创建文件夹'''
        if not os.path.exists(aid):
            os.mkdir(aid)
    
    
    def remove_move_file(aid):
        '''删除和移动文件'''
        file_list = os.listdir('./')
        for file in file_list:
            # 移除临时文件
            if file.endswith('_video.mp4'):
                os.remove(file)
                pass
            elif file.endswith('_audio.mp4'):
                os.remove(file)
                pass
            # 保存最终的视频文件
            elif file.endswith('.mp4'):
                if os.path.exists(aid + '/' + file):
                    os.remove(aid + '/' + file)
                shutil.move(file, aid)
    

    主要包括两方面的基本处理,为正式爬取下载做准备:

    • 利用正则表达式提取信息
      通过requests库请求得到请求后的网页,属于文本,通过正则表达式提取得到关于将要下载的视频的有用信息,便于后一步处理。
    • 文件处理
      将下载视频完成后的相关文件进行处理,包括删除生成的临时的音视频分离的文件和移动最终视频文件到指定文件夹。

    4.下载视频

    def download_video_batch(referer_url, video_url, audio_url, video_name, index):
        '''批量下载系列视频'''
        # 更新请求头
        headers.update({"Referer": referer_url})
        # 获取文件名
        short_name = video_name.split('/')[2]
        print("%d.\t视频下载开始:%s" % (index, short_name))
        # 下载并保存视频
        video_content = requests.get(video_url, headers=headers)
        print('%d.\t%s\t视频大小:' % (index, short_name),
              round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
        received_video = 0
        with open('%s_video.mp4' % video_name, 'ab') as output:
            headers['Range'] = 'bytes=' + str(received_video) + '-'
            response = requests.get(video_url, headers=headers)
            output.write(response.content)
        # 下载并保存音频
        audio_content = requests.get(audio_url, headers=headers)
        print('%d.\t%s\t音频大小:' % (index, short_name),
              round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
        received_audio = 0
        with open('%s_audio.mp4' % video_name, 'ab') as output:
            headers['Range'] = 'bytes=' + str(received_audio) + '-'
            response = requests.get(audio_url, headers=headers)
            output.write(response.content)
            received_audio += len(response.content)
        return video_name, index
    
    
    def download_video_single(referer_url, video_url, audio_url, video_name):
        '''单个视频下载'''
        # 更新请求头
        headers.update({"Referer": referer_url})
        print("视频下载开始:%s" % video_name)
        # 下载并保存视频
        video_content = requests.get(video_url, headers=headers)
        print('%s\t视频大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
        received_video = 0
        with open('%s_video.mp4' % video_name, 'ab') as output:
            headers['Range'] = 'bytes=' + str(received_video) + '-'
            response = requests.get(video_url, headers=headers)
            output.write(response.content)
        # 下载并保存音频
        audio_content = requests.get(audio_url, headers=headers)
        print('%s\t音频大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
        received_audio = 0
        with open('%s_audio.mp4' % video_name, 'ab') as output:
            headers['Range'] = 'bytes=' + str(received_audio) + '-'
            response = requests.get(audio_url, headers=headers)
            output.write(response.content)
            received_audio += len(response.content)
        print("视频下载结束:%s" % video_name)
        video_audio_merge_single(video_name)
    

    这部分包括系列视频的批量下载和单个视频的下载,两者的大体实现原理近似,但是由于两个函数的参数有差别,因此分别实现。
    在具体的实现中,首先更新请求头,请求视频链接并保存视频(无声音),再请求音频链接并保存音频,在这个过程中得到相应的视频和音频文件的大小。

    5.视频和音频合并成完整的视频

    def video_audio_merge_batch(result):
        '''使用ffmpeg批量视频音频合并'''
        video_name = result.result()[0]
        index = result.result()[1]
        import subprocess
        video_final = video_name.replace('video', 'video_final')
        command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (
            video_name, video_name, video_final)
        subprocess.Popen(command, shell=True)
        print("%d.\t视频下载结束:%s" % (index, video_name.split('/')[2]))
    
    
    def video_audio_merge_single(video_name):
        '''使用ffmpeg单个视频音频合并'''
        print("视频合成开始:%s" % video_name)
        import subprocess
        command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (
            video_name, video_name, video_name)
        subprocess.Popen(command, shell=True)
        print("视频合成结束:%s" % video_name)
    

    这个过程也是批量和单个分开,大致原理差不多,都是调用subprogress模块生成子进程,Popen类来执行shell命令,由于已经将ffmpeg加入环境变量,所以shell命令可以直接调用ffmpeg来合并音视频。

    6.3种下载方式的分别实现

    def batch_download():
        '''使用多线程批量下载视频'''
        # 提示输入需要下载的系列视频对应的id
        aid = input('请输入要下载的视频id(举例:链接https://www.bilibili.com/video/av91748877?p=1中id为91748877),默认为91748877\t')
        if aid:
            pass
        else:
            aid = '91748877'
        # 提示选择清晰度
        quality = input('请选择清晰度(1代表高清,2代表清晰,3代表流畅),默认高清\t')
        if quality == '2':
            pass
        elif quality == '3':
            pass
        else:
            quality = '1'
        acc_quality = int(quality) - 1
        # ssl模块,处理https请求失败问题,生成证书上下文
        ssl._create_default_https_context = ssl._create_unverified_context
        # 获取视频主题
        url = 'https://www.bilibili.com/video/av{}?p=1'.format(aid)
        html = etree.HTML(requests.get(url, params=params, headers=headers).text)
        title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
        print('您即将下载的视频系列是:', title)
        # 创建临时文件夹
        create_folder('video')
        create_folder('video_final')
        # 定义一个线程池,大小为3
        pool = ThreadPoolExecutor(3)
        # 通过api获取视频信息
        res_json = requests.get('https://api.bilibili.com/x/player/pagelist?aid={}'.format(aid)).json()
        video_name_list = res_json['data']
        print('共下载视频{}个'.format(len(video_name_list)))
        for i, video_content in enumerate(video_name_list):
            video_name = ('./video/' + video_content['part']).replace(" ", "-")
            origin_video_url = 'https://www.bilibili.com/video/av{}'.format(aid) + '?p=%d' % (i + 1)
            # 请求视频,获取信息
            res = requests.get(origin_video_url, headers=headers)
            # 解析出视频详情的json
            video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
            video_info = {}
            # 获取视频品质
            quality = video_info_temp['data']['accept_description'][acc_quality]
            # 获取视频时长
            video_info['duration'] = video_info_temp['data']['dash']['duration']
            # 获取视频链接
            video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
            # 获取音频链接
            audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
            # 计算视频时长
            video_time = int(video_info.get('duration', 0))
            video_minute = video_time // 60
            video_second = video_time % 60
            print('{}.\t当前视频清晰度为{},时长{}分{}秒'.format(i + 1, quality, video_minute, video_second))
            # 将任务加入线程池,并在任务完成后回调完成视频音频合并
            pool.submit(download_video_batch, origin_video_url, video_url, audio_url, video_name, i + 1).add_done_callback(
                video_audio_merge_batch)
        pool.shutdown(wait=True)
        time.sleep(5)
        # 整理视频信息
        if os.path.exists(title):
            shutil.rmtree(title)
        os.rename('video_final', title)
        try:
            shutil.rmtree('video')
        except:
            shutil.rmtree('video')
    
    
    def multiple_download():
        '''批量下载多个独立视频'''
        # 提示输入所有aid
        aid_str = input(
            '请输入要下载的所有视频id,id之间用空格分开\n举例:有5个链接https://www.bilibili.com/video/av89592082、https://www.bilibili.com/video/av68716174、https://www.bilibili.com/video/av87216317、\nhttps://www.bilibili.com/video/av83200644和https://www.bilibili.com/video/av88252843,则输入89592082 68716174 87216317 83200644 88252843\n默认为89592082 68716174 87216317 83200644 88252843\t')
        if aid_str:
            pass
        else:
            aid_str = '89592082 68716174 87216317 83200644 88252843'
        if os.path.exists(aid_str):
            shutil.rmtree(aid_str)
        aids = aid_str.split(' ')
        # 提示选择视频质量
        quality = input('请选择清晰度(1代表高清,2代表清晰,3代表流畅),默认高清\t')
        if quality == '2':
            pass
        elif quality == '3':
            pass
        else:
            quality = '1'
        acc_quality = int(quality) - 1
        # 创建文件夹
        create_folder(aid_str)
        # 创建线程池,执行多任务
        pool = ThreadPoolExecutor(3)
        for aid in aids:
            # 将任务加入线程池
            pool.submit(single_download, aid, acc_quality)
        pool.shutdown(wait=True)
        time.sleep(5)
        # 删除临时文件,移动文件
        remove_move_file(aid_str)
    
    
    def single_download(aid, acc_quality):
        '''单个视频实现下载'''
        # 请求视频链接,获取信息
        origin_video_url = 'https://www.bilibili.com/video/av' + aid
        res = requests.get(origin_video_url, headers=headers)
        html = etree.HTML(res.text)
        title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
        print('您当前正在下载:', title)
        video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
        video_info = {}
        # 获取视频质量
        quality = video_info_temp['data']['accept_description'][acc_quality]
        # 获取视频时长
        video_info['duration'] = video_info_temp['data']['dash']['duration']
        # 获取视频链接
        video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
        # 获取音频链接
        audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
        # 计算视频时长
        video_time = int(video_info.get('duration', 0))
        video_minute = video_time // 60
        video_second = video_time % 60
        print('当前视频清晰度为{},时长{}分{}秒'.format(quality, video_minute, video_second))
        # 调用函数下载保存视频
        download_video_single(origin_video_url, video_url, audio_url, title)
    
    
    def single_input():
        '''单个文件下载,获取参数'''
        # 获取视频aid
        aid = input('请输入要下载的视频id(举例:链接https://www.bilibili.com/video/av89592082中id为89592082),默认为89592082\t')
        if aid:
            pass
        else:
            aid = '89592082'
            # 提示选择视频质量
        quality = input('请选择清晰度(1代表高清,2代表清晰,3代表流畅),默认高清\t')
        if quality == '2':
            pass
        elif quality == '3':
            pass
        else:
            quality = '1'
        acc_quality = int(quality) - 1
        # 调用函数进行下载
        single_download(aid, acc_quality)
    

    在一般情形下,下载的需求包含3种情况:

    • 单个视频的下载
      只有一个视频,没有和它属于同一个系列的其他视频,如下图
      单个视频下载
      此时,除了右下方的相关推荐中的视频,没有其他视频,右上方只有弹幕列表、没有视频列表。为了代码的复用,将单个视频下载时提示用户输入需求的代码单独提取出来作为single_input(),下载的函数另外作为single_download(aid, acc_quality)函数实现,在该函数中:
      通过视频链接如https://www.bilibili.com/video/av89592082解析网页,得到相应的字符串并转化成json,如下:
      视频信息json转化
      字符串json格式化可使用https://www.sojson.com/editor.html进行在线转化。
      获取到视频的标题、根据输入确定的视频质量、持续时长、视频链接和音频链接,并调用download_video_single()函数下载该视频。
    • 多个视频的下载
      这里,多个视频之间是没有关系的,多个视频的下载实际上是先获取到所有的aid,并进行循环,对每个视频链接传入参数调用单个视频下载的函数即可。同时设立线程池,大小为3,既不会对资源有太大的要求,也能实现多任务、提高下载效率。
    • 系列视频的下载
      此时,多个视频属于同一系列,如https://www.bilibili.com/video/av91748877是一个课程系列,如下
      系列视频
      显然,此时右上方有视频列表,标明了有65个子视频,每个视频用p标识,如第2个视频就是https://www.bilibili.com/video/av91748877?p=2。对于所有视频,先获取到视频的相关信息,再加入进程池进行下载,并在任务结束之后回调函数video_audio_merge_batch()合并音视频,并进行文件整理。

    7.主函数

    def main():
        '''主函数,提示用户进行三种下载模式的选择'''
        download_choice = input('请输入您需要下载的类型:\n1代表下载单个视频,2代表批量下载系列视频,3代表批量下载多个不同视频,默认下载单个视频\t')
        # 批量下载系列视频
        if download_choice == '2':
            batch_download()
        # 批量下载多个单个视频
        elif download_choice == '3':
            multiple_download()
        # 下载单个视频
        else:
            single_input()
    
    
    if __name__ == '__main__':
        '''调用主函数'''
        main()
    

    主函数中实现3种下载方式对应的函数的分别调用。

    三、项目分析和说明

    1.结果测试

    对3种方式进行测试的效果如下:

    project test 1
    project test 2
    project test 3
    3种下载情景的测试效果均较好,下载速度也能与一般的下载速度相媲美。
    代码可点击https://download.csdn.net/download/CUFEECR/12243122https://github.com/corleytd/Python_Crawling/blob/master/bilibili_downloader_1.py进行下载。

    改进说明

    B站网站也一直在变化,所以对于下载可能也会有一些变化,所以将改进的地方在下面列举出来:

    • 网址参数变化
      举例说明:
      这段时间发现B站一个视频系列的链接变成https://www.bilibili.com/video/BV1x7411M74h?p=65,即是无规律的字符串(可能是经过某种算法编码或加密得到的),现在从链接中不能得到视频(系列)的aid,这时候可以借助浏览器工具抓包查看数据来找到该视频的aid,如下:
      aid2bvid
      在左侧寻找stat开头的请求,后边的参数即为aid,该请求api的完整链接为https://api.bilibili.com/x/web-interface/archive/stat?aid=91748877,所以可以直接在该链接中获取aid,也可以查看该请求的具体内容,可以看到第一个数据就是aid,我们也可以看到随机字符串就是bvid,可能是建立了aid和bvid的一一映射,找到aid就可以正常下载了。

    2.软件打包

    在命令行中,使路径位于代码所在路径运行

    pyinstaller bilibili_downloader_1.py
    

    打印

    136 INFO: PyInstaller: 3.6
    137 INFO: Python: 3.7.4
    138 INFO: Platform: Windows-10-10.0.18362-SP0
    140 INFO: wrote xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.spec
    205 INFO: UPX is not available.
    209 INFO: Extending PYTHONPATH with paths
    ['xxxx\\Bili_Video_Batch_Download',
     'xxxx\\Bili_Video_Batch_Download']
    210 INFO: checking Analysis
    211 INFO: Building Analysis because Analysis-00.toc is non existent
    211 INFO: Initializing module dependency graph...
    218 INFO: Caching module graph hooks...
    247 INFO: Analyzing base_library.zip ...
    5499 INFO: Caching module dependency graph...
    5673 INFO: running Analysis Analysis-00.toc
    5702 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
      required by xxx\python\python37\python.exe
    6231 INFO: Analyzing xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.py
    7237 INFO: Processing pre-safe import module hook   urllib3.packages.six.moves
    10126 INFO: Processing pre-safe import module hook   six.moves
    14287 INFO: Processing module hooks...
    14288 INFO: Loading module hook "hook-certifi.py"...
    14296 INFO: Loading module hook "hook-cryptography.py"...
    14936 INFO: Loading module hook "hook-encodings.py"...
    15093 INFO: Loading module hook "hook-lxml.etree.py"...
    15097 INFO: Loading module hook "hook-pydoc.py"...
    15099 INFO: Loading module hook "hook-xml.py"...
    15330 INFO: Looking for ctypes DLLs
    15334 INFO: Analyzing run-time hooks ...
    15339 INFO: Including run-time hook 'pyi_rth_multiprocessing.py'
    15344 INFO: Including run-time hook 'pyi_rth_certifi.py'
    15355 INFO: Looking for dynamic libraries
    15736 INFO: Looking for eggs
    15737 INFO: Using Python library xxx\python\python37\python37.dll
    15757 INFO: Found binding redirects:
    []
    15776 INFO: Warnings written to xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_1\war
    n-bilibili_downloader_1.txt
    15942 INFO: Graph cross-reference written to xxxx\Bili_Video_Batch_Download\build\bilibili_dow
    nloader_1\xref-bilibili_downloader_1.html
    15967 INFO: checking PYZ
    15968 INFO: Building PYZ because PYZ-00.toc is non existent
    15968 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade
    r_1\PYZ-00.pyz
    16944 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade
    r_1\PYZ-00.pyz completed successfully.
    16980 INFO: checking PKG
    16981 INFO: Building PKG because PKG-00.toc is non existent
    16981 INFO: Building PKG (CArchive) PKG-00.pkg
    17030 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
    17034 INFO: Bootloader xxx\python\python37\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
    17034 INFO: checking EXE
    17035 INFO: Building EXE because EXE-00.toc is non existent
    17035 INFO: Building EXE from EXE-00.toc
    17037 INFO: Appending archive to EXE xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_
    1\bilibili_downloader_1.exe
    17046 INFO: Building EXE from EXE-00.toc completed successfully.
    17053 INFO: checking COLLECT
    17053 INFO: Building COLLECT because COLLECT-00.toc is non existent
    17055 INFO: Building COLLECT COLLECT-00.toc
    

    出现INFO: Building EXE from EXE-00.toc completed successfully. 即打包成功。
    在当前路径下找到distbuild目录下的bilibili_downloader_1目录下的bilibili_downloader_1.exe,即是打包后的软件。
    点击打开即可进行选择和输入,开始下载相应视频。
    测试示例如下:
    project test 4
    bilibili_downloader_1.exe的同级目录下可以看到下载保存的视频。

    3.改进分析

    该项目是小编进行B站视频下载的首次尝试,难免有很多不足,在实现的过程中和后期的总结中,可以看出还存在一些问题:

    • 还不能下载B站上的所有视频,目前局限于各种普通视频教程,不能下载直播视频、大会员番剧等,可以在后期进一步优化;
    • 代码过于繁琐,有不少功能类似的重复代码,可以进一步简化、提高代码的复用性;
    • 没有采取适当的措施应对B站的反爬,可能会因为请求过多而无法正常下载。
      可以在后期进行优化,使整个程序更加健壮。

    4.合法性说明

    • 本项目的出发点是方便地下载B站上的学习视频,可以更好地学习各类教程,这对程序猿来说也是一种福利,但是绝不用与其他商业目的,所有读者可以参考执行思路和程序代码,但不能用于恶意和非法目的(恶意频繁下载视频、非法盈利等),如有违者请自行负责。
    • 本项目在实施的过程中可能参考了其他大佬的实现思路,如有侵犯他人利益,请联系更改或删除。
    • 本项目是B站视频批量下载系列的第一篇,有很多尚待改进的地方,后期会继续更新,欢迎各位读者交流指正,以期不断改进。
    展开全文
  • 破解游戏软件经常会被报毒? 转载答案: 一般都是启发式引擎的误报。主要因素有以下3点:1.破解后程序的加密壳导致的。比如大部分破解程序都会套上个Vmp,Tmd一类保护型外壳,这类加密壳杀毒的什么特征码、虚拟机...

    作者:qmwatcher
    链接:https://www.zhihu.com/question/28029995/answer/39206383
    来源:知乎

    破解游戏和软件经常会被报毒?

    转载答案:
    一般都是启发式引擎的误报。主要因素有以下3点:1.破解后程序的加密壳导致的。比如大部分破解程序都会套上个Vmp,Tmd一类保护型外壳,这类加密壳杀毒的什么特征码、虚拟机分析都不管用,本着错杀1万也不放过一个的原则,就给你报了。2.破解后的程序组装的pe结构非正常编译器的结构,被怀疑为区段附加感染病毒。典型的就是360经常爆的qvm一类的。3.破解时使用了远程代码注入,跨进程内存写入一类的动作操作,这种API的组合调用被沙盘分析发现,就会按危险操作进行定义,报成可疑病毒。

    总结:其实一般的软件非正常出版或则正规应用都会使用容易被识别成病毒的结构,所以适当的查证再选择相信一些应用才是一个聪明的网民,错过一些好的应用耽误一些事情并不是好的选择。

    展开全文
  • Linux有一些游戏是用AppImage格式来封装的,很多小伙伴下载软件之后却不知道要如何运行它,表示很无奈。 下面就说明一下AppImage软件的运行方法吧。 打开控制台 首先 cd 你要运行的AppImage文件绝对路径 (进入...

    Linux有一些游戏是用AppImage格式来封装的,很多小伙伴下载了软件之后却不知道要如何运行它,表示很无奈。

    下面就说明一下AppImage软件的运行方法吧。


    打开控制台

    首先 cd 你要运行的AppImage文件绝对路径 (进入目录);

    然后 chmod +x 你的应用文件名.AppImage(为应用文件添加执行权限,注意,是文件名,不是应用名或者游戏名,而且+x是要输完哟);

    最后 ./你的应用文件名.AppImage(执行文件, ./后面是没有空格的哦)

    好了,这样就能使用AppImage的应用了。


    最后追加游戏福利(Linux游戏站):https://www.linuxgame.cn/

    展开全文
  • 许多人在下班或者放学之后都会选择玩几局游戏来放松自己,有时候在游戏中,我们经常会有一些比较优异、... 第一步、首先我们录制游戏视频需要下载一款屏幕录像工具,之后我们根据软件上的提示安装这款软件。  ...
  • 慢慢地,就积累了一些关于游戏录屏的经验,下面是我经常用到的三款游戏录制软件推荐给大家。推荐一:直播平台自带软件-斗鱼TV直播助手斗鱼TV直播助手是斗鱼直播官方的游戏直播录播的工具你无需过多的操作,就可以...
  • 首次使用掌盟APP需要在线联网下载更新安装才能使用,未下载软件游戏的运行图标是灰暗色的!不能运行,下面介绍两种激活方法:一种是联网下载安装。另一种是不联网下载手工激活! 第一种是联网下载安装: 在应用...
  • 对于开发者来说,申请软件著作权是保护自身利益的重要法律手段,开发人员申请软件著作权就要写软件设计说明和使用说明,怎样写呢? 这里给出目录,说明了大概需要写的内容。如下: xxx游戏 用户使用软件设计说明 ...
  • 游戏测试与软件测试的区别

    千次阅读 2019-05-15 17:13:15
    关于软件测试与游戏测试的区别,网上也有几篇文章提到,但是感觉没有描述的特别清晰,原因无非2点:一是即做过软件测试又做过游戏测试的人本身不多,二是在软件游戏测试都做过的这一小撮人里善于归纳总结的更是少...
  • 软件说明书游戏

    千次阅读 2014-10-13 13:04:20
    我把软件开发称作为一种协作游戏。Stack Overflow就是把软件开发的在线讨论重塑成一种协作游戏;在游戏里,想要“获胜”的唯一方法就是相互学习。
  • 手机软件界面设计人员的广阔乐园.  搜应用网是中国最丰富的手机资源下载站,为你提供精彩的手机图片.手机应用软件.手机游戏,定制服务手机用户的个性化需求,是广大手机用户.手机开发者.手机软件界面设计人员的...
  • DirectX修复工具下载V3.5增强 绿色版 工具软件

    万次下载 热门讨论 2016-06-23 11:46:59
    该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将...
  • 杭州拇指30掌盟平台APP格式游戏软件是国产山寨手机上的应用格式之一,这种格式与MRP格式的应用一样!是专门针对MTK平台手机开发的一种应用格式!这种格式的应用也越来越多的被国产机的手机厂商采用!很多本站的灵...
  • 游戏软件功能测试用例编写

    千次阅读 2019-06-16 14:49:04
    一、游戏软件与通用软件的区别  a)通用软件的需求明确,游戏软件需求理想化  i. 通用软件中用户每步操作的预期结果都是明确且有规范可参考的,而网游中并不是所有的需求都有一个明确的预期结果,拿技能平衡性来说...
  • 它拥有Google Play市场内所有免费付费应用游戏,无需科学上网在全球目前没被封锁屏蔽,应用更新的速度推送快,全部应用可以直接免费下载。当您遇到应用下架或线路问题时,还有对于没安装谷歌应用商店的人来说是个...
  • 值得推荐的MAC软件下载软件的网站

    千次阅读 2019-08-10 23:45:33
    开心软件园 - 软件资讯、下载使用交流 Yanu - 分享优秀、纯净、绿色、实用的精品软件。ChromeGAE唯一官方网站 首页-大软坊-绿色 数字未来 | Digital Future 产品类别 Windows | 极致分享 Uptodow...
  • 本文针对虚拟机(VM)在无线游戏开发中的应用情况和缺陷,提出了两种新的开发方案。 在无线网络的建设完成之后,电信网络的内容提供商和应用开发商普遍认为,长期稳定的业务是保证持久利润的关键。许多分析
  • 一级计算机基础及MSOffice应用模拟软件,本软件按照较新《全国计算机等级考试一级计算机基础及MS Office应用考试大纲》研发而成。软件具有自动计时、随机抽题、全真模拟、精选习题、详尽解析等功能。软件中包含近年...
  • 软件测试与游戏测试的不同之处

    千次阅读 2017-12-10 19:25:31
    游戏本质也是软件的一种,所以从测试工程的角度来讲,游戏测试与软件测试的本质是完全相同的。2者的不同更多的是在表象层面或者流程方面,我们可以把游戏测试看作软件测试的子类,它继承了软件测试这个父类的特性,...
  • Linux如何下载安装软件超详细解析

    万次阅读 多人点赞 2019-09-04 16:58:47
    网上很多Linux下载软件的方法,看了很多帖子感觉Linux下载软件的方式有很多,每个人都有自己的习惯,对于一个新手来说及其不友好,有时候会看的很蒙。在这里做出总结。
  • 禁止windows10的windows update也没用,要怎么强制禁用?
  • 免费下载IOS/MAc付费软件

    千次阅读 2019-05-22 22:30:16
    去网上搜索其他人分享的苹果ID,比如App Store 美区/账号分享、IOS已购应用/游戏、小火箭、AVPlayer播放器 等等关键词搜索,一般情况下都可以搜到。 这种方法虽然免费,但是免费也是有代价的,登录别人的账号...
  • 游戏模型设计用什么软件

    千次阅读 2019-06-14 10:14:27
    maya游戏角色建模师需要非常了解人体组织结构骨骼构建,需要了解各种游戏人物的表现风格,包括Q版和写实类的,了解游戏美术光影,掌握材质灯光的表现手法,还要熟练使用maya等三维软件。  maya游戏角色建模...
  • 这里小编给大家整理了一些游戏场景建模师常用的软件,主要还是为新手建模师们提供一些有价值的软件推荐。 一、游戏场景建模软件的选择 建模软件:3DS Max、Maya、C4D 推荐使用:3DS Max 最基础的当然就是建模...
  • 最常见的游戏建模软件有哪些?

    千次阅读 2020-09-06 16:33:17
    3D建模软件普遍存在于我们的日常的...适配专业:动画、游戏、室内设计 提到3D建模软件,很多人第一反应都会想到3D MAX和Maya。 Maya被视为CG的行业标准,拥有一系列无与伦比的工具和功能。它的工具包非常复杂,..
  • 使用Capture插件可以录制屏幕捕获视频,使用PlayOnLinux Vault可以保存和还原已安装的应用程序,而Wine Look插件则可以更改Windows应用程序使用的主题。 If PlayOnLinux doesn’t have the application you want, ...
  • 为什么下载游戏时速度只有十几KB,但下载视频却又几百KB,游戏的大小是13G。速度慢的要死,有没有使游戏下载速度加快的软件
  • 游戏乱码解决软件 NTLEA

    千次阅读 2013-04-29 23:08:23
    ...NTLEA (NT Locale Emulator Advance),是一...专门用来解决游戏软件乱码。尤其是喜欢玩日语游戏的小盆友们可以注意了。 支持 windows 7 X64 最近更新了 0.92版本 功能还是比较强的 使用方法,
  • 这是我从国内外多个网站收集的iOS系统下的iPhone、iPad和iPod touch各种的开源(Open Source)应用游戏App列表。这些开源的应用代码跟Windows等平台的开源软件一样,对想学习iOS开发的朋友来说是非常好的教程案例...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 309,904
精华内容 123,961
关键字:

下载游戏的软件应用