見出し画像

【Python】ChromeDriver+selenium4でgoogle自動検索 その3

ちょっと前から始めているアルバイトの関係で、
「Python+ChromeDriver+Selenium4でGoogle自動検索」
をいかに効率的に行うかをいろいろ試行錯誤したので、その際の技術的メモを残しておきます。今回は第3弾。

第1弾、第2弾はコチラ。

動作環境

Windows 11 Home (64bit)
Chrome 113.0.5672.64(Official Build) (64 ビット)
chromedriver 112.0.5615.49
Python 3.11.1
Selenium 4.9


便利なロガーを使ってPrint卒業

Pythonには「logging」というライブラリがあって、一言で言うとプログラム全体のログ設計がもう出来ているイメージ。「logging」ライブラリの仕様はググればたくさん出てくると思うので、ここでは、自分が「logging」ライブラリをどのように組み込んだかをご紹介します。
具体的には、
「プログラムの実行毎に、プログラムの入出力ファイルと実行ログファイルをプログラム開始時間タイムスタンプ付きディレクトリにまとめる」
を実装しました。

import datetime
import logging
import os
import shutil
import time

#ログ出力ディレクトリ作成&ログ設定
now = datetime.datetime.now()
current_time = now.strftime("%Y%m%d-%H%M%S-")
dir_for_output = "./result/" + current_time
os.makedirs(dir_for_output, exist_ok = True)

result_filename = dir_for_output + "/Result.csv"
log_filename = dir_for_output + "/process.log"

logging.basicConfigを書いておけば、後は勝手にログファイルに実行ログが出力されていきます(今回で言うと、chromedriverの起動ログなど)。

#ロガーフォーマット
logger_format = "%(asctime)s %(levelname)s:%(message)s"

logging.basicConfig(level=logging.INFO, filename=log_filename, format=logger_format)

入力パラメータファイルを実行ログフォルダにコピー。

# 入力パラメータファイル名を生成し、
# 使用するパラメータファイルを結果出力フォルダにコピー
keyword_filename = "./setting_keyword/keyword_" + CATEGORY + ".txt"
ignore_title_filename = "./setting_ignore/ignore_common_title.txt"
ignore_com_filename = "./setting_ignore/ignore_common_url.txt"
ignore_filename = "./setting_ignore/ignore_" + CATEGORY + ".txt"
shutil.copy2(keyword_filename, dir_for_output)
shutil.copy2(ignore_title_filename, dir_for_output)
shutil.copy2(ignore_com_filename, dir_for_output)
shutil.copy2(ignore_filename, dir_for_output)

プログラムの処理状況をログに出力(ログレベル:情報、の例)

logging.info(logStr)

プログラムの処理状況をログに出力(ログレベル:エラー、の例)

try:
  例外が発生しうる処理
except Exception as e:
	logging.error('エラー')

でもやっぱりprintで標準出力にも出したい!ってときは、どっちにも出力する関数を1つ作っておけばスッキリ。

def mylog(logStr):
  logging.info(logStr)
  print(logStr)

最終的に実行ログフォルダをリネームしたかったのですが、loggerがログファイルをがっちり掴んで離してくれなかったので、プログラムの一番最後でlogging.shutdown()を呼び出し、loggerが使用しているリソースを解放してからリネーム。

logging.shutdown()
time.sleep(REST)
shutil.move(dir_for_output, dir_for_output + CATEGORY)

質問、ご指摘等あればお気軽に。


頂いたサポートは、クリエイターとしての活動費として使用させていただきます!