CodeGym /コース /Python SELF JA /最小の動的要素で複数ページを巡回する方法

最小の動的要素で複数ページを巡回する方法

Python SELF JA
レベル 38 , レッスン 1
使用可能

1. ナビゲーションの準備

冒険に出かける前に、正しいツールで準備しましょう:Seleniumと少しの工夫が必要です。Seleniumとブラウザドライバーの設定方法は既に知っている前提で、さあ始めましょう!

ドライバーの設定

Python

from selenium import webdriver

# ブラウザドライバーを起動 (例: Chrome)
driver = webdriver.Chrome()

# 冒険の最初のページを開く
driver.get("http://example.com/start-page")

ここまでは標準的です―ブラウザを開いて開始ページをロードしました。でもここからが面白いところ:1ページに留まるのではなく、その隣のページにも行ってみたいですよね!

2. ページネーション: ページ巡り

ページを巡る一番簡単で親しみやすい方法はページネーションです。ページ下部にあるあの小さな数字を見たことがあるでしょう? それは道路標識のようなもの:「次の停車地はページ2です」と教えてくれます。

ページからのデータ抽出

旅を始める前に、現在のページから情報を収集したいですね。例えば、商品リストや記事のタイトルなど。

Python

def extract_data():
    # ページ上で興味のある要素を探す (例: タイトル)
    titles = driver.find_elements_by_class_name("item-title")
    for title in titles:
        print(title.text)  # テキストを出力。保存するのもアリ

extract_data()

以前の講義をサボっていた人には、このコードがページ上のクラスitem-titleを持つ全てのタイトルを見つけて、出力するものだと説明します。

次のページへのナビゲーション

データ収集が完了したら、次のステップに進む時間です。ページネーションは通常、次のページや前のページへのリンクボタンの形で表現されます。これらのボタンを見つけてクリックする必要があります。

Python

def go_to_next_page():
    try:
        # 次のページのボタンを見つけてクリック
        next_button = driver.find_element_by_link_text("Next")
        next_button.click()
    except NoSuchElementException:
        # ボタンがない場合、最後に到達したことを意味します
        print("ページリストの終わりです。")

この関数はテキスト「Next」を持つリンクを探します。見つかった場合、それをクリックして次のページに進みます。見つからなかった場合、ボットは終了を理解します...少なくともそのページシーケンスの中で。

3. ページ巡回のループ

完全な幸せのために何が欠けていますか? そう、ループです! これを1つの便利なループにまとめて、ボットがすべての利用可能なページをプロフェッショナルのように巡回できるようにしましょう。

Python

while True:
    extract_data()  # 現在のページからデータを収集
    go_to_next_page()  # 次のページに進む
    time.sleep(2)  # サーバーを驚かせないための少しの休憩

これでボットはすべての「Next」ボタンがあるページを勇敢に巡ります。このコードはページがなくなるまで実行されます。リクエスト間の小さな休憩が重要です。スパマーは誰も好きではありません、特にウェブサイトの管理者。

4. 動的なインタラクション

皆さん、人生はこのページネーションの例のように簡単ではありません。稀にページは忍者のように振る舞い、スクロールするたびに動的にデータをロードします。でも大丈夫、これも対処可能です。

明示的な待機

待機機能を使うことで、必要な要素が利用可能になるまでコードを一時停止できます。これはコンテンツがすぐに読み込まれない場合に特に便利です。

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def wait_for_element(locator):
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, locator))
        )
        return element
    except TimeoutException:
        print("要素が見つかりませんでした。")

この関数を使えば、ボットは動的にロードされるコンテンツと調和し、要素が利用可能になるのを待つことができます。

ページのスクロール

動的コンテンツを含む無限スクロールのような不思議なページでは、他の要素をロードするためにページを下にスクロールする必要があるかもしれません。

Python

def scroll_down():
    # JavaScriptを使って下にスクロール
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

JavaScriptスクリプトはスムーズな下方向スクロールを実現し、ページがコンテンツをロードする時間を与えます。この技術をループで使用すると、無限スクロールを巡回するのに役立ちます。

5. ヒントとトリック

この例を超えて、ボットが様々なシナリオに備えられるようにすることが重要です。

「Next」ボタンがない場合でも、ページ番号でのページネーションがある場合は、URLに直接番号を挿入する動的な方法を使用します。また、万が一、対象のサイトが忍者のように動作していくつかのページを隠してしまったら、スクリプトを調整して不測の事態に備えましょう。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION