【爬虫系列】Python如何实现进度条效果?

news2024/12/23 11:49:23

一、需求

在爬取数据过程中,发现不看输出日志是不知道当前的爬取进度,而单纯靠控制台输出日志信息也不方便判断。因此,就想办法给爬取过程加个进度条,实时展示当前的爬取进度。

有了这个需求和想法之后,那如何实现呢?目前有两类实现显示进度条的方案,一种是使用 Python 内置模块,比如 time 模块;另一种是引入第三方专用模块,比如 tqdm 模块,alive-progress 模块等。

二、内置模块实现进度条效果

1、简单进度条

import sys, time

def test_simple():
    for i in range(1, 101):
        print("\r", end="")
        print(f"当前爬取进度:{i}%:", "▋" * (i // 2), end="")
        sys.stdout.flush()
        time.sleep(0.05)

测试效果:

 2、带时间进度条

import time

def test_with_time():
    scale = 50
    start = time.perf_counter()
    for i in range(scale + 1):
        progress = "▋" * i
        point = "." * (scale - i)
        c = (i / scale) * 100
        during = time.perf_counter() - start
        print("\r{:^3.0f}%【{}->{}】{:.2f}s".format(c, progress, point, during), end="")
        time.sleep(0.1)

测试效果:

三、第三方模块实现进度条效果

1、tqdm模块

tqdm 是专门用于快速生成进度条的模块,使用前先下载该模块:

pip install tqdm
实现代码:
import time
from tqdm import tqdm

def test_tqdm():
    # tqdm构造器内放入可迭代的对象
    for i in tqdm(range(1, 101)):
        # do somethings
        time.sleep(0.1)

测试效果:

2、alive-progress模块

官网描述:alive-progress 是一个实时展示进度,具有非常酷炫动画效果的进度条工具。

先下载该模块:

pip install alive-progress

实现代码:

from alive_progress import alive_bar

def test_alive_progress(task_num, totals, sleep_time):
    for i in range(task_num):  # 定义任务数
        with alive_bar(totals, bar='blocks', title=f'Task {i + 1}') as bar:
            for i in range(totals):
                time.sleep(sleep_time)
                bar()

test_alive_progress(5, 150, 0.02)

测试效果:

参考了官网的文档,说是运行过程中会有动画效果(实操过程中并未看到呢?)!!

3、其他模块(了解)

3.1 progress模块:Easy progress reporting for Python!

官网地址:progress · PyPI

3.2 PySimpleGUI模块:是一款基于GUI界面展示工具,功能强大,可用于进度条展示。

 

官网地址:

PySimpleGUI · PyPI

四、总结

其实,第三方模块实现显示进度条功能,底层也是基于内置模块的第二种方式。因此,这里不打算使用第三方库实现进度条,而是采用内置模块实现,选择第二种,并嵌入到代码中。

接下来,将我之前爬取天气数据的方法 operate_selenium() 改造一下,代码如下:

def common_selenium(url, citys, path):
    scale = len(citys)
    start = time.perf_counter()  # 起始计时点
    for i in range(len(citys) + 1):
        # 进度条相关计算
        progress = "▋" * i
        point = "." * (scale - i)
        c = (i / scale) * 100
        # 最后一次列表不存在元素,避免异常,不执行
        if i == scale:
            pass
        else:
            browser = webdriver.Chrome()  # 使用谷歌浏览器
            browser.maximize_window()  # 窗口最大化
            browser.get(url)  # get请求天气网地址
            time.sleep(2)
            # 搜索指定城市天气
            today_weathers = operate_selenium(browser, citys, pos=i, path=path)
            # print(f'city:{citys[i]},today_weathers:{today_weathers}')
            write_log(today_weathers, citys[i], path)
            # 休眠5s,再关闭浏览器
            time.sleep(5)
            browser.quit()
        # 进度条实时显示
        during = time.perf_counter() - start
        print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, progress, point, during), end="")
        time.sleep(0.01)

循环爬取城市列表,当爬取到某一座城市的天气信息时,天气数据获取的进度如下:

25 %[▋->...]34.66s

50 %[▋▋->..]51.63s

100%[▋▋▋▋->]69.58s

这下看进度就清晰多了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s中不同名称空间下的pod无法解析服务名

1、背景 公司的项目需要使用容器化部署,为了更好的维护和管理,我将各个项目按照命名空间进行隔离开,但是却发现存在一些问题 不同的系统间需要项目调用,而且是按照服务名进行调用,但是却导致不同名称空间下pod无法解析…

mac 快应用开发工具 真机调试 usb调试 提示Error:没有找到Android设备

项目场景: 项目场景:mac使用快应用开发工具连接Android手机 问题描述 显示错误没有找到Android设备 原因分析: adb连接的问题 解决方案: 1.确保手机开启开发者模式 2.确保手机与mac的连接线能传输数据,有的线只能…

python+moviepy音视频处理(一):基本操作

目录 视频处理 视频加载和输出 视频转换gif 视频裁剪 视频音量调节 去掉视频声音 视频中的音频提取与替换 获取视频属性 倍数播放视频 截取视频某帧为封面 多视频拼接 音频处理 替换视频文件的音频 多个音频文件拼接 安装:pip install moviepy 中文官…

【自学Docker】Docker stats命令

Docker stats命令 大纲 docker stats命令教程 docker stats 命令可以用于动态显示 Docker容器 的资源消耗情况,包括:CPU、内存、网络I/O。docker stats命令也可以指定已停止的容器,但是不会返回任何信息。 docker stats命令语法 haicoder…

Windows下载安装Nignx

下载 下载地址:http://nginx.org/en/download.html 下载完成以后,得到nginx压缩包; Nginx启动 方式一:可执行文件启动 双击nginx.exe启动 现在,我们打开任务管理器,如果发现nginx进程存在,说明启动完成; 方式二:命令行启动 进入nginx所在…

【Mysql第三期 基本查询语句结构】

文章目录1. SQL概述1.1 SQL背景知识1.2SQL 分类2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 (建议遵守)2.3 注 释2.4 命名规则(暂时了解)3.基本的SELECT语句3.1 查询基本结构3.2 列的别名3.3 去除重复行扩展windows cmd…

同步FIFO设计verilog设计及仿真

同步FIFO设计 1.功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计。由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。写入和读出的操作由时钟的上升沿触发。当FIFO的数据满和空的时候分别设置相应的高电平加以指示。 2.顶层信号定义: 信号名…

最小生成树问题(Prim算法和Kruskal算法)

问题引入: 这算是一道模板题了,只不过这次在做的时候感觉又学到了些新的东西,之前都是数据结构里学的,因为用惯了C,所以就想摆脱那些邻接数组之类的写法,用STL试一下,在其中把我遇到的一些问题写…

【论文翻译】边缘应用中加速卷积神经网络的剪枝算法综述

摘要 随着卷积神经网络(CNN)模型大小的增加,模型压缩和加速技术对于在边缘设备上部署这些模型变得至关重要。在本文中,我们对修剪进行了全面的调查,这是一种主要的压缩策略,可以从CNN模型中删除非关键或冗…

iOS_Memory Leak 内存泄露治理

1、内存分类 官方文档介绍 app 的内存分三类: Leaked memory:Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument) Abandoned memory:Memory still referenced b…

设计模式 - 结构型模式_桥接模式

文章目录结构型模式概述CaseBad ImplBetter Impl小结结构型模式 结构型模式主要是解决如何将对象和类组装成较大的结构, 并同时保持结构的灵活和⾼效。 结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理,这7类 概述 桥接模式的…

2023牛客寒假算法基础集训营4

A-清楚姐姐学信息论 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 不同进制对于信息的表示效率不同,清楚姐姐最近学习了信息论中使用不同进制表示信息的方法,她现在想要比较两种不同进制表示信息时,谁的…

从软件角度看PCIe设备的硬件结构

从软件角度看PCIe设备的硬件结构 文章目录从软件角度看PCIe设备的硬件结构参考资料:一、 PCIe接口引脚二、 从软件角度理解硬件接口2.1 PCI/PCIe地址空间转换2.2 PCIe上怎么传输地址、数据三、 PCIe系统的硬件框图致谢参考资料: 《PCI Express Technolo…

ElasticSearch概念与架构原理

文章目录一、概述二、ElasticSearch架构原理三、ElasticSearch搜索入门一、概述 ElasticSearch简介 简介 ES是建立在Lucene基础之上的分布式准实时搜索引擎,它所提供的诸多功能中有一大优点,就是实时性好。比如:在业务需求中,新增…

计算机图形学 第7章 自由曲线曲面

先说好,第八章不学。 目录学习目标曲线与曲面的表示形式插值与逼近Bezier曲线定义一次Bezier曲线二次Bezier曲线⭐⭐⭐三次Bezier曲线⭐⭐⭐三次Bezier曲线的Bernstein基函数:Bernstein基函数的性质Bezier曲线的性质de Casteljau算法几何作图法绘制Bezie…

Struts2之拦截器

Struts2之拦截器1、Struts2体系架构1.1、执行流程1.2、核心接口和类1.3、流程简图2、Struts2拦截器2.1、使用拦截器的目的2.2、拦截器的简介2.3、拦截器的工作原理2.4、拦截器的使用2.4.1、创建自定义拦截器2.4.2、struts.xml中定义和配置拦截器2.4.3、Struts2默认拦截器2.4.4、…

Leetcode.2319 判断矩阵是否是一个 X 矩阵

题目链接 Leetcode.2319 判断矩阵是否是一个 X 矩阵 Rating : 1201 题目描述 如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X矩阵 : 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n的二维整数数组 grid&#…

ElasticSearch - 旅游酒店案例es功能实现

目录 案例 搜索与分页功能 条件过滤功能 附近的酒店功能 广告置顶功能 HotelService(es操作)总览 案例 搜索与分页功能 案例需求:实现旅游的酒店搜索功能,完成关键字搜索和分页实现步骤如下:1.定义实体类,接收前端请求实体…

微信小程序用vant自定义tabbar页面并跳转相应页面

0.前置安装 步骤一 安装 vant 组件库 npm i vant/weapp -S --production下载完后要npm构建才能使用 步骤二 修改 app.json 将 app.json 中的 "style": "v2" 去除,小程序的新版基础组件强行加上了许多样式,难以覆盖,不…

分布式定时任务框架选型

目录 1. 前言 2. 定时任务框架 3. 分布式任务调度系统对比 4. 和quartz框架对比 5. 综合对比 6. 总结和结论 7. 附定时任务的其他方案 1. 前言 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清…