環境
- Windows 10
- Python 3.10.1
- VSCode
動作イメージ
自動で起動しています(※全画面にするとgifのサイズが大きくなるので、悪しからず…)
使用するソースコード
以下の公開リポジトリに置いています
tao-py-py/packages/daily_subscribe at main · masayan1126/tao-py-py
pythonリポジトリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.
実装の流れ
- 毎日購読しているサイトの一覧をエクセルで用意する
サイト名やurl、ID、パスワード等を記載しておく - pandasで1.のエクセルを読み取る
- 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