[Python 爬虫这样学,一定是大拇指拉!] DAY29 - 实战演练:自制进度条 Progress Bar

自制 Progress Bar

继前一篇,来补充自制一个小功能,让这个程序会好用一些些。

爬虫在爬的时候,看 console 的画面空荡荡的,是不是会有一种莫名的空虚感,而且也不知道剩下多少还没爬/images/emoticon/emoticon10.gif

所以这篇文章主要教大家怎麽做一个 Progress Bar,让人可以知道爬虫目前的进度!

其实 Python 也有套件可以直接用,但了解原理之後我觉得自己做并不难,而且可以依照自己的需求做设计,使用上也会比较有弹性。/images/emoticon/emoticon37.gif

所以~我们来动手做吧!

class ProgressBar:
    bar_string_fmt = "\rProgress: [{}{}] {:.2%} {}/{}"
    cnt = 0

    def __init__(self, total, bar_total=20):
        # task 的总数
        self.total = total

        # progress bar 的长度,可依个人喜好设定
        self.bar_total = bar_total

    def update(self, step=1):
        # 更新 progress bar 的进度

        total = self.total
        self.cnt += step

        # bar 的数量
        bar_cnt = (int((self.cnt/total)*self.bar_total))
        # 空白的数量
        space_cnt = self.bar_total - bar_cnt

        # 显示 progress bar
        # "\r" 的意思代表 replace,print 出来的字串不会印在新的一行而是 replace 原本那行同个位置的字符
        # {:.2%},表示 format 进来的值会以百分比显示,并只取到小数点後两位
        progress = self.bar_string_fmt.format(
            "█" * bar_cnt,
            " " * space_cnt,
            self.cnt/total,
            self.cnt,
            total
        )

        print(progress, end="")
        
        percent = self.cnt/total
        # 100%
        if percent == 1:
            print("\n")
        elif percent >= 1:
            print("")
            
if __name__ == '__main__':
    # 测试
    total = 10000
    progress_bar = ProgressBar(total)

    for _ in range(total):
        # do something...
        progress_bar.update()

输出(GIF):

bar_total = 30(静态图):
https://ithelp.ithome.com.tw/upload/images/20211014/20139358Sr6NR41Btl.png
bar_total = 50(静态图):
https://ithelp.ithome.com.tw/upload/images/20211014/20139358Kchwj3XyQq.png

我们把它套用在上一篇自动更新每日个股日成交资讯的爬虫里面。
稍微对 DailyPriceSpider 这个类别做一些修改,才能使用 Progress Bar。
要改的地方不多,重复的程序码我就不放了/images/emoticon/emoticon39.gif


class DailyPriceSpider:

    def __init__(self, progress_bar=None):

        # 重复使用 TCP 连线
        self.req = requests.Session()
        self.url = "https://www.twse.com.tw/exchangeReport/STOCK_DAY"
        self.headers = self.req.headers

        # 伪装 User-Agent
        ua = UserAgent()
        self.headers["User-Agent"] = ua.random

        # 加入 progress bar 这个类别
        if progress_bar:
            self.progress_bar = progress_bar

    # ...省略

    def scrape(self, date, stock_no, save_path=""):
        res = self.__get(date, stock_no)
        if save_path:
            res_text = res.text
            self.__save_file(res_text, save_path)

        # 更新 progress bar
        if self.progress_bar:
            self.progress_bar.update()

        return res

另外主程序的部分:

if __name__ == '__main__':
    # ...省略

    stock_info_list = stock_info_list_file.get("stock", [])
    # 加入 progress bar
    progress_bar = ProgressBar(len(stock_info_list))
    dps = DailyPriceSpider(progress_bar=progress_bar)

    # ...省略

这样就能看到我们的爬虫进度罗!
(静态图)
https://ithelp.ithome.com.tw/upload/images/20211014/201393589nn1uc9k47.png

以上就是 Progress Bar 的教学!

那整个系列文也差不多到这边结束罗!如果有任何疑虑的地方,还请多多指教!


<<:  Day29 - 使用Keystore加密密码

>>:  Day30 WebRTC 一对多连线

Day23 - Shioaji X Backtesting - RSI低买高卖策略

好啦!之前介绍过了如何用Backtesting套件来实做均线的策略, 前面也介绍过了如何安装Ta-l...

第 6 天 调整 HeroDetail 的显示方式|AppRoutingModule、ActivatedRoute

前情提要 昨天我们完成了英雄细节元件 HeroDetailComponent,并且使用属性系结(pr...

[DAY 09] 光头古早味手工蛋饼

光头古早味手工蛋饼 地点:台南市新营区东兴路203号 时间:6:00~11:30 如果仔细看可以发现...

Day.7 保有日常备份重要性 - binlog 解析 &备份资料 (mysqldump / binlog)

回顾一下上篇提到的binlog纪录作用,可以用来做资料复原和主从机制下的重要数据纪录。 开始前先了...