实现实时显示下载的百分比进度

首先导入所需要的包:

import requests  # 网络请求模块
import os        # 操作系统模块
import re        # 正则表达式
import time      # 时间模块
import random    # 随机模块

输入小视频json地址(建议使用bilibili_api包):

son_url = 'https://www.bilibili.com/v/popular/all/?spm_id_from=333.1007.0.0'

创建一个爬取类:

class Crawl():
    def __init__(self):
        # 创建头部信息
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0'}

    def get_jsonurl(self,json_url):
        response = requests.get(json_url, headers=self.headers)
        # 判断请求是否成功
        if response.status_code == 200:
            return response.json()  # 返回json信息
        else:
            print('获取json信息的请求没有成功!')

    def download_video(self,video_url,titlename):
        size = 0     # 记录叠加每次写入大小的变量
        # 下载视频的网络请求
        response = requests.get(video_url, headers=self.headers, stream=True)
        content_size = int(response.headers['content-length'])  # 视频内容的总大小
        chunk_size = 1024  # 单次请求最大值
        if not os.path.exists('video'):  # 如果video目录不存在时
            os.mkdir('video')             # 创建该目录
        if response.status_code == 200:   # 判断请求是否成功
            if os.path.exists('video'):
                print('视频文件大小:%0.2fMB' % (content_size / chunk_size / 1024))  # 换算单位,并打印文件大小
                with open('video/'+titlename+'.mp4', 'wb')as f:                     # 将视频写入指定位置
                    for data in response.iter_content(chunk_size=chunk_size):       # 循环写入,实现一段一段的写
                        f.write(data)                                                # 写入视频文件
                        f.flush()                                                    # 刷新缓存
                        size += len(data)                                            # 叠加每次写入的大小
                        # 打印下载进度
                        print('\r 文件下载进度:%d%%(%d/%d)'%
                              (float(size / content_size * 100),size,content_size), end=" ")
        else:
            print('视频下载失败!')

主要程序:

if __name__ == '__main__':
    C = Crawl()
    ranking = 0                                           # 排名变量
    for page in range(0,10):
        json = C.get_jsonurl(json_url.format(page=page))  # 获取返回的json数据
        infos=json['data']['items']                       # 信息集
        for info in infos:                               # 遍历信息
            ranking+=1                                    # 叠加排名
            print('\n正在下载排名第',ranking,'的视频')
            title = info['item']['description']        # 视频标题
            # 只保留标题中英文、数字与汉字,其它符号会影响写入文件
            comp = re.compile('[^A-Z^a-z^0-9^\u4e00-\u9fa5]')
            title = comp.sub('',title )                # 将不符合条件的符号替换为空
            video_url = info['item']['video_playurl']  # 视频地址
            C.download_video(video_url,title)          # 下载视频,视频标题作为视频的名字
        time.sleep(random.randint(3,6))                     # 随机产生获取json请求的间隔时间

 内容来源于网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现异步实现百分比显示apk安装下载,可以通过以下步骤: 1. 在下载apk时,使用异步任务(AsyncTask)来执行下载操作,并在异步任务中更新下载进度。 2. 在更新下载进度时,可以使用广播(Broadcast)或回调(Callback)来通知UI线程更新下载进度条。 3. 在UI线程中,可以使用ProgressBar控件来显示下载进度条,并在接收到下载进度更新的广播或回调时,更新ProgressBar的进度。 4. 在下载完成后,使用广播或回调通知UI线程下载已完成,然后显示安装界面并启动安装。 下面是一个简单的示例代码: ```java public class DownloadTask extends AsyncTask<String, Integer, String> { private Context mContext; private ProgressBar mProgressBar; public DownloadTask(Context context, ProgressBar progressBar) { mContext = context; mProgressBar = progressBar; } @Override protected void onPreExecute() { super.onPreExecute(); mProgressBar.setProgress(0); } @Override protected String doInBackground(String... urls) { String apkUrl = urls[0]; try { URL url = new URL(apkUrl); URLConnection connection = url.openConnection(); connection.connect(); int fileLength = connection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream(), 8192); OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/app.apk"); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); mProgressBar.setProgress(values[0]); } @Override protected void onPostExecute(String result) { Toast.makeText(mContext, "下载完成", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath() + "/app.apk")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); } } ``` 在MainActivity中,可以通过以下代码来启动下载任务: ```java ProgressBar progressBar = findViewById(R.id.progress_bar); DownloadTask downloadTask = new DownloadTask(this, progressBar); downloadTask.execute("http://example.com/app.apk"); ``` 这样就可以在下载apk时异步更新进度条,并在下载完成后自动启动安装。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会编程555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值