1. 動的要素の理解
まず、動的コンテンツの性質について少し説明しよう。サイトにいると仮定して、ページを下にスクロールすると、必要に応じてデータがさらに表示される。その様子は、ずっと広がっていて、空飛ぶ絨毯に乗っているような感じだね。これをレイジーローディング("lazy loading")と呼ぶんだ。リソースを節約し、必要なときにだけコンテンツを読み込む巧妙なテクニックだ。そんな時に静的HTMLに依存するのは、猫が朝のコーヒーを持ってきてくれるのを期待するようなものだ。
動的要素って何?
動的要素とは、ページ全体をリロードしなくても変化するウェブページの一部だよ。AJAXリクエストを介して読み込まれたり、JavaScriptを通じてページに埋め込まれたりする。こうした要素に対処するためのいくつかの戦略をマスターすることが重要で、そうすればアプリケーションもコンテンツのように動的になるんだ。
2. インタラクションの戦略
実践的な魔法の時間だ!動的要素を操作するためには「人生は動きだ、それに対応する準備ができている」ということを理解するツールが必要だ。私たちの魔法のアーセナルにはSeleniumがある。それはまるで人間のようにブラウザとやり取りできる。
AJAXリクエストの操作
AJAX(エイジャックス)は、ウェブページ全体をリロードせずに、部分的に更新する技術なんだ。ユーザーにとって便利だけど、スクレイパーの開発者にとっては少し厄介なこともある。でも大丈夫、私たちには秘密兵器のWebDriverWaitとexpected_conditions(Seleniumの一部)がある。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ドライバーの設定
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")
# 要素が現れるのを待つ
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic_element_id"))
)
print(element.text)
finally:
driver.quit()
待機メソッドの利用
動的要素を扱うとき、ブラウザが必要な状態になるまで時間を与えるのが重要だよ。WebDriverWait
とexpected_conditions
の組み合わせのような待機メソッドは、すべての必要な要素が読み込まれるまでじっくり待つことを可能にしてくれる。まるで自分をジムに連れて行くようなものだね—時間はかかるけど、結果は価値がある。
例:
-
presence_of_element_located
— 要素がDOMに出現するのを待つ。 -
visibility_of_element_located
— 要素が表示されるのを待つ。 -
element_to_be_clickable
— 要素がクリック可能になるのを待つ。
以下はボタンのクリック可能性を待つ例だよ:
button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()
ページのスクロール
コンテンツがスクロール時に読み込まれる場合、「スクロール」の技術が必要だ。SeleniumはJavaScriptを使用してスクロールすることができ、新しいデータを読み込むのに役立つよ。
# ページの一番下までスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
コンテンツをすべて読み込むために、ループ内でスクロールを実装してみよう:
SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# ページがコンテンツを読み込む時間を待つ
WebDriverWait(driver, SCROLL_PAUSE_TIME)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
3. 実践的なインタラクション例
待つこと、観察することを学んだ今、これらのスキルを活用して、すべての動的データをキャッチする時だ!
例えば、下にスクロールすることで商品が表示されるページがあると仮定しよう。商品名と価格をそれぞれ取得したい場合:
products = []
while True:
# 下にスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 新しい要素が読み込まれるのを待つ
WebDriverWait(driver, SCROLL_PAUSE_TIME)
# 商品データを取得する
items = driver.find_elements(By.CLASS_NAME, "product-item")
for item in items:
name = item.find_element(By.CLASS_NAME, 'product-name').text
price = item.find_element(By.CLASS_NAME, 'product-price').text
products.append({'name': name, 'price': price})
# 新しいデータが読み込まれたか確認
# (単純な方法: itemsリストが増えていなければ終了)
if len(products) == last_known_count:
break
last_known_count = len(products)
動的要素が思ったように早く読み込まれない場合、忍耐とスキルを発揮する必要があるね。WebDriverWaitによる条件設定、ページスクロール、JavaScriptインジェクション—これらはすべて動的コンテンツの世界を征服する鍵だよ。偉大なジェダイが言ったように:”忍耐だ、若きパダワンよ”。この場合、忍耐とはすべてのデータを成功裏にスクレイピングすることを意味するんだ。
作業が成功した日の終わりのように、慎重にセッションを終了しよう。
driver.quit()
最後に、コードがエラーなく正確に動作することを確認するのが大事だ。それだけが「ミッション完了」と自信を持って言える方法だよ。動的データの世界を旅する君の成功を祈るよ!
GO TO FULL VERSION