毎日チェックするウェブサイトをPythonで一気に自動起動する

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

動作イメージ

自動で起動しています(※全画面にするとgifのサイズが大きくなるので、悪しからず…)

使用するソースコード

以下の公開リポジトリに置いています

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 330 million projects.

実装の流れ

  1. 毎日購読しているサイトの一覧をエクセルで用意する
    サイト名やurl、ID、パスワード等を記載しておく
  2. pandasで1.のエクセルを読み取る
  3. 2.の内容をもとにseleniumでブラウザを起動してサインイン等が必要なサイトは認証しサイトを起動する

実装

packages\daily_subscribe\main.py
...割愛

# 自動起動したいサイトのurlやログイン情報を記載したエクセルを読み込み
subscribe_list_filepath = (
    "C:\\Users\\nishigaki\\jupyter-lab\\packages\\daily_subscribe\\subscribe_list.xlsx"
)

# 内部の実装でpandasを使用
subscribe_wb = XExcel().read(filepath=subscribe_list_filepath, sheet_name=None)
subscribe_sheet = subscribe_wb.get_sheet_by_name("subscribe_list")
subscribe_records = subscribe_sheet.get_records(0, 100, 0, 10)
subscribe_list = DataFrameConverter.to_dictionary(subscribe_records)

if len(subscribe_list) == 0:
    sys.exit()

# ブラウザ起動準備 ---------------------------------------------------------------------------------------------------
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
chrome_options.add_experimental_option("detach", True)  # 処理完了後もブラウザが起動している状態を保持する
chrome_service = fs.Service(executable_path=ChromeDriverManager().install())
xdriver = XDriver(chrome_service, chrome_options, "Chrome")

# エクセルの内容をもとに、ブラウザ起動
for subscribe in subscribe_list:
    driver = OpenBrowserService().execute(xbrowser=XBrowser(xdriver, XUrl(subscribe["url"])), needs_multiple_tags=False)

    # ブラウザで起動するサイトの種別に応じてmatch~case文で処理
    match SiteType(subscribe["site_type"]):
        # 認証必要で、かつIDとパスワードの入力画面が別
        case SiteType.NEEDS_LOGIM_AND_TWO_STEP:
            xweb_element_list = XWebElementList(web_elements=[
                # user_id
                XWebElement(
                    FindWebElementService(SeleniumScraper(driver=driver)).find_element_by_id(
                        subscribe["user_id_elem"]),
                    subscribe["user_id"]
                ),
            ])

            SetWebElementService().execute(xweb_element_list)
            FindWebElementService(SeleniumScraper(driver=driver)).find_element_by_xpath(
                subscribe["submit_elem"]).click()

            sleep(1)
            xweb_element_list = XWebElementList(web_elements=[
                # user_password
                XWebElement(
                    FindWebElementService(SeleniumScraper(driver=driver)).find_element_by_id(
                        subscribe["pass_elem"]
                    ),
                    subscribe["password"],
                )
            ])

            # パスワード入力後サブミットボタン
            SetWebElementService().execute(xweb_element_list)

            # TODO: 固定になっている
            xweb_element_list.get_web_element_list()[0].get_element().send_keys(Keys.TAB)
            xweb_element_list.get_web_element_list()[0].get_element().send_keys(Keys.TAB)
            xweb_element_list.get_web_element_list()[0].get_element().send_keys(Keys.ENTER)

        # 認証必要で、かつIDとパスワードの入力画面が同じ
        case SiteType.NEEDS_LOGIM_AND_ONE_STEP:
            xweb_element_list = XWebElementList(web_elements=[
                # user_id
                XWebElement(
                    FindWebElementService(SeleniumScraper(driver=driver)).find_element_by_id(
                        subscribe["user_id_elem"]
                    ),
                    subscribe["user_id"],
                ),
                # user_password
                XWebElement(
                    FindWebElementService(SeleniumScraper(driver=driver)).find_element_by_id(
                        subscribe["pass_elem"]
                    ),
                    subscribe["password"],
                )
            ])
           
            SetWebElementService().execute(xweb_element_list)
            FindWebElementService(SeleniumScraper(driver=driver)).find_element_by_xpath(
                subscribe["submit_elem"]
            ).click()
        #認証不要
        case _:
            pass

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2023/01/31 18:22時点)
タイトルとURLをコピーしました