概要
現状の環境で動作するのか確認したかったのでメモ
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 件のコメント:
コメントを投稿