2024年2月2日金曜日

Python で selenium を動かすサンプルコード

Python で selenium を動かすサンプルコード

概要

現状の環境で動作するのか確認したかったのでメモ
Chrome は起動中のウィンドウを使います

環境

  • macOS 11.7.10
  • chrome 120.0.6099.216
  • chromedriver 120.0.6099.109

chromedriver

  • brew install chromedriver

インストール

  • pipenv install selenium

chrome 起動

  • "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222

サンプルコード

特定のサイトの商品IDの一覧を先に取得しその後 ID を元に商品のリンク先に飛びリンク先のテキスト情報を表示する流れです

(どうしても安定しないところは sleep やリトライを入れるしかないのだろうか)

import time

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# 既存chromeを起動
chromeoptions = Options()
chromeoptions.debugger_address = "127.0.0.1:9222"
driver = webdriver.Chrome(options=chromeoptions)


def init():
    driver.get("https://your.target.site")
    driver.find_element(By.XPATH, '//*[@id="js-list"]/div/a').click()


def init_ids() -> list:
    init()
    ids = []
    products = driver.find_elements(By.XPATH, '//*[@id="js-list"]/ul/li/div')
    for p in products:
        id = p.get_attribute("id")
        ids.append(id)
    return ids


def show_product_info(id: str):
    init()
    driver.find_element(By.XPATH, f'//div[@id="{id}"]').click()
    time.sleep(2)
    driver.find_element(By.XPATH, '//*[@id="js-product-tabs"]/div[1]/cite/a').click()
    try:
        driver.find_element(By.XPATH, '//*[@id="a_performer"]').click()
    except NoSuchElementException:
        pass
    print(driver.find_element(By.XPATH, '//*[@id="title"]').text)
    print(driver.find_element(By.XPATH, '//*[@id="performer"]').text)
    # 戻る
    driver.back()


def close():
    driver.close()


if __name__ == "__main__":
    ids = init_ids()
    for id in ids:
        show_product_info(id)
    close()

最後に

selenium は相変わらずDOMの表示タイミングなどがシビアなので安定して動かすのが大変な印象です
仕方なくブラウザからしか情報が取得できない場合を除きできる限り selenium は使わないほうがいいと思います

個人のツールとしてならありかなと思います

参考サイト

0 件のコメント:

コメントを投稿