対象者
Chat GPTを使用してコードの修正を行いたい方
Chat GPTで何ができるか知りたい方
Chat GPT事前準備
Chat GPTの始め方を知りたい方はこちら
実際のコード
今回使うコードは下記になります。
スクレイピング用のコードです。
※Webサイトの操作を自動化するものです。
クリックや値入力など定形作業の自動化によく使われています。
作業の流れとしては
①エクセルからデータを取得
②メールアドレスを入力して検索
③完全一致するとチェックを付ける
④対象のアカウントを削除の流れです。
from cgitb import html
import openpyxl
import time
import datetime
from selenium import webdriver
dt_now = datetime.datetime.now()
nowyeare = (dt_now.year)
nowmonth = (dt_now.month-1)
print(nowyeare)
print(nowmonth)
yameta_book = openpyxl.load_workbook("エクセルファイル名.xlsx")
yameta_sheet = yameta_book['Sheet1']
time.sleep(3)
#最大行
maxrow = yameta_sheet.max_row
#最大列
maxclm = yameta_sheet.max_column
# 開始行
startrow =yameta_sheet.min_column
# 開始列
startclm =yameta_sheet.min_row
s = 3
i = 3
print(maxrow)
yameta_name =[]
yameta_adress = []
while i <= maxrow:
yameta_list2 =yameta_sheet.cell(row=s, column=3).value
yameta_name.append(yameta_list2)
i = i + 1
s = s + 1
print(yameta_name)
else:
print(yameta_name)
s = 3
i = 3
while i <= maxrow:
yameta_list =yameta_sheet.cell(row=s, column=6).value
yameta_adress.append(yameta_list)
i = i + 1
s = s + 1
print(yameta_adress)
else:
print(yameta_adress)
# -----------退職一覧からデータ取得---------------------
driver = webdriver.Firefox()
driver.get("管理画面")
# 1.5 秒 止める
time.sleep(1.5)
login_id = driver.find_element_by_xpath("/html/body/form/center/table/tbody/tr[2]/td/table/tbody/tr[1]/td[2]/input")
login_pw = driver.find_element_by_xpath("/html/body/form/center/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]/input")
userid = "管理画面のID"
userpw = "パスワード"
login_id.send_keys(userid) #ログインID
login_pw.send_keys(userpw) #ログインパスワード
time.sleep(1)
login_btn = driver.find_element_by_xpath("/html/body/form/center/table/tbody/tr[2]/td/table/tbody/tr[3]/td/input[2]")#ログインボタン
login_btn.click()
time.sleep(2)
# ---------ログイン画面----------
iframe = driver.find_element_by_css_selector("html > frameset:nth-child(2) > frame:nth-child(1)")#iframeをCSSセレクタで特定
driver.switch_to.frame(iframe)#親フレームからiframeに移動
masuta_btn = driver.find_element_by_xpath("/html/body/table[2]/tbody/tr/td[3]/a")
masuta_btn.click()
time.sleep(2)
syainmasuta_btn = driver.find_element_by_xpath("/html/body/table[3]/tbody/tr/td[5]/a")
syainmasuta_btn.click()
time.sleep(2)
serch_btn = driver.find_element_by_xpath("/html/body/table[3]/tbody/tr/td[1]/a")
serch_btn.click()
time.sleep(2)
driver.switch_to.default_content()#フレームを一度終了する
disp = driver.find_element_by_css_selector("html > frameset:nth-child(2) > frame:nth-child(2)")
driver.switch_to.frame(disp)#フレームを切り替える
syain_name = driver.find_element_by_xpath("/html/body/table[2]/tbody/tr[2]/td[2]/input")#
time.sleep(2)
#----------------------------------------検索画面まで
for taisyokusya in yameta_name:
syain_name.send_keys(taisyokusya)
kensaku_btn = driver.find_element_by_xpath("/html/body/table[2]/tbody/tr[2]/td[3]")#検索ボタン
kensaku_btn.click()#検索ボタン押す
time.sleep(2)
try:
mailadress = driver.find_element_by_xpath("/html/body/table[3]/tbody/tr[2]/td[9]").text#検索ヒットした人のメールアドレス
# print(mailadress)
for taisyokusya2 in yameta_adress:
if mailadress == taisyokusya2:
delete_btn = driver.find_element_by_xpath("/html/body/table[3]/tbody/tr[2]/td[11]/table/tbody/tr[2]/td/input[4]")
delete_btn.click()
print(taisyokusya2)
time.sleep(2)
delete2_btn = driver.find_element_by_xpath("/html/body/center/form/input[5]")
delete2_btn.click()
time.sleep(2)
back_btn = driver.find_element_by_xpath("/html/body/center/form/input")
back_btn.click()
pass
except:
syain_name = driver.find_element_by_xpath("/html/body/table[2]/tbody/tr[2]/td[2]/input")#社員名
syain_name.clear()
pass
driver.switch_to.default_content()
コードを修正させてみた
早速上記のコードを入力して、効率化できるか見てみましょう。
コード入力後最終行に、効率化してと入力してみます。
そうすると、下記画像のように返答がありました。
ふむふむ、2つ効率化できる場所があるそうです。
1つ目はWhileで値を取得している箇所を、forに変更するということですね。
現在それぞれを一つずつの処理にしていますが、まとめて一つの処理にしようということみたいです。
二つ目は、現在無条件で何秒間待機して次の処理に移行するのですが
それを、対象の動作ができるまで待機して処理に移行するようです。
※今回は10秒待機なので、それ以上ページの読み込みなどに時間がかかると処理できません。
一つ目の、処理をまとめる箇所は修正前から予測していましたが
二つ目の待機時間は、予想外でした。
他にはもうないかなと思いながらも、再度下記の質問をしてみました。
「他に修正したほうが良いところはある」
①変数名の命名
はい、おっしゃる通りです。
部署内で私しか触っていなかったコードなので、適当なアルファベットにしておりました。
②例外処理の改善
こちらもそうですね。
ただこれは、当時の部長に言われて無理やりこの処理に変えたような記憶です
③Seleniumの処理の改善
当時の私には冗長かどうかわかっていませんでしたね。
属性はXpathで基本取得していますね。
サイトの構造変更になっても問題ないようにID、Classを取得しろということですかね。
④関数の使用
これは当時も言われていましたね。
保守の効率化のためにも、関数にしてくれと
ただ、正直自分がいなくなった後は、、、
良くないですね。保守性も考えましょう。
⑤コメントの追加
④と一緒ですね。
自分だけがわかるコードは本当に良くないですね。
最後に
保守するときに、コードを読み込ませて効率化してみるのはありかもしれませんね。
Chat GPTでコードの
修正・効率化もできるのでやってみましょう!
[Chat GPT]Chat GPTオススメの使用方法とPowershell作成してみた。
[Chat GPTでPython]Chat GPTを使用してPythonプログラム作成してみた。
[Chat GPTでGAS]Chat GPTを使用してGASを作成してみた。