iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Software Development

Python 爬蟲這樣學,一定是大拇指拉!系列 第 29

[Python 爬蟲這樣學,一定是大拇指拉!] DAY29 - 實戰演練:自製進度條 Progress Bar

  • 分享至 

  • xImage
  •  

自製 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 的教學!

那整個系列文也差不多到這邊結束囉!如果有任何疑慮的地方,還請多多指教!


上一篇
[Python 爬蟲這樣學,一定是大拇指拉!] DAY28 - 實戰演練:集大成 - 自動更新每日個股日成交資訊
下一篇
[Python 爬蟲這樣學,一定是大拇指拉!] DAY30 - 結語
系列文
Python 爬蟲這樣學,一定是大拇指拉!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言