見出し画像

Pythonでやってみた7: スクレイピングシステム の作成Selenium×tkinter×Pyinstaller

1.概要

 前回紹介したスクレイピングをそれっぽいシステム風に使えるように作成してみました。基礎コードはすべて下記記事を参考にしています。

2.システム作成の流れ

 今回作成したシステム作成の流れは下記の通りです。

【システム作成の流れ】
1.基本的なスクレピング処理を作る。
2.1.をモジュール化してtkinterの関数として組み込む
3.2を丸ごとPyinstallerでexe化する。

3.コード紹介

 上記の流れで作成してきます。フォルダ構成は下記の通りです。

【各種ファイルの説明】
●Selenium用ドライバ:chromedriver.exe
●スクレイピング用モジュール:webscraping1.py
●ID・PASS管理用モジュール:secretidpass.py
●tkinter用ファイル(exe化用):webスクレイピングシステム.py

3-1.スクレイピングのモジュール作成

 前回の記事をそのまま関数して|pyファイル⦅モジュール⦆としました。

[webscraping1.py]
import os , datetime, time
from dataclasses import dataclass
from selenium.common.exceptions import NoSuchElementException
from selenium import webdriver

#UsernameとPasswordを自作モジュールから取得
import secretidpass as secret
username, password = secret.ID().ID, secret.PASS().PASS

def main():
#ブラウザの立上
    driver = webdriver.Chrome('chromedriver.exe') #GUI用
    driver.implicitly_wait(5)

    url = 'https://www2.pitapa.com/login.html'
    driver.get(url)

    #ログイン操作
    driver.find_element_by_name("id").send_keys(username)#ID入力
    driver.find_element_by_name("password").send_keys(password)#PASS入力
    driver.find_element_by_name("login").click() #ログインボタンをクリック

    driver.find_element_by_link_text("ご利用代金・明細照会").click()

    meisai = driver.find_elements_by_tag_name('select')[1]
    meisai.click()

    latestmonth = meisai.text.splitlines()[0]
    meisai.send_keys(latestmonth)
    driver.find_element_by_name("displaySubmit").click() 

    #CSVボタンを押す。
    driver.find_element_by_name("csvSubmit").click() 

    time.sleep(1)
    driver.quit()

    #ダウンロードしたCSVファイルを作業ディレクトリに移動
    import shutil

    #推定ファイル名を作成
    today = datetime.datetime.today()
    csvname = today.strftime("%Y%m") + ".csv"

    #ダウンロードしたCSVファイルを作業ディレクトリに移動
    path_donwload = "C:/Users/KIYO/Downloads"
    path_csv = os.path.join(path_donwload, csvname)

    if os.path.exists(path_csv):
        shutil.move(path_csv, os.getcwd())
        print(f'CSVファイルを{os.path.dirname(path_csv)}->{os.getcwd()}に移動しました。')
        
if __name__ == '__main__':
    main()         

3-2.tkinterにスクレイピングの関数追加

 tkinterには「ウィンドウを閉じるタブ」と「スクレイピング処理するボタン」を追加しました。ボタンを押して期待される動作ができれば成功です。

[In]
import tkinter as tk
import secretidpass as sec
import webscraping1 as webs1

def main():
    webs1.main() #モジュールからスクレイピング用関数を呼び出し

base = tk.Tk()
base.geometry('300x50') #ウィンドウサイズの調整
base.title('Webスクレイピングシステム')
menubar = tk.Menu(base) # メニューバーを作成
base.config(menu=menubar) # メニューバーを設定

tab = tk.Menu(menubar) # メニューを作成
menubar.add_cascade(label="ファイル", menu=tab) #タブを追加
tab.add_command(label="閉じる", command=lambda: base.destroy()) 

tk.Button(base, text="Pitapa領収書", width=30, command=main).pack()

base.mainloop()

3-3.Pyinstallerでexe化

 最後に上記で作成したtkinterのファイルをexe化します。終了のお知らせを見たいため"--noconsole"オプションは無しにしました。

[Terminal]
pyinstaller Webスクレピングシステム.py --onefile

4.完成品

 完成したexeファイルを実行してみます。なんかごちゃごちゃ出ますが動いたのでヨシッ!

 なお今回テスト用として作っており丁寧にパスを通していないため、exeファイルは開発したフォルダ内でないと動きませんのでご留意ください。幅広く使う場合はsysライブラリなどでパスを通せばいけるはずです。


あとがき

 ふと思って作ってみたけどすんなりいってよかった。作成したスクリプトを共有するときstreamlitばっかり使ってたけど、簡易システムであればこういうパターンもありかも。

【備忘録】
追記1:処理完了はtkinterのメッセージボックスの"showinfo"をいれてpyinstallerの"--noconsole"にしたらすっきりするやん・・

この記事が気に入ったらサポートをしてみませんか?