CodeGym /コース /Python SELF JA /複数ページをクロールするための基本的なアプローチ

複数ページをクロールするための基本的なアプローチ

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

1. 「次へ」ボタンの使用

サイトに次のページに移動するための「次へ」ボタンやリンクがある場合は、そのボタンをクリックするためのループを設定し、ボタンが利用可能な限りクリックを続けられるよ。

コード例

Python

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    # 現在のページからデータを収集する例
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)  # ここでデータを保存または処理することができる
    
def click_next_button(driver):
    try:
        next_button = driver.find_element(By.LINK_TEXT, "Next")
        next_button.click()
        return True
    except NoSuchElementException:
        return False  # ボタンが見つからない場合は、最後のページに到達

def main():
    driver = initialize_driver()
    open_page(driver, "https://example.com/page1")

    try:
        while True:
            collect_data(driver)
            if not click_next_button(driver):
                break  # 「Next」ボタンが見つからない場合はループを終了
            time.sleep(2)  # 次のページの読み込みを待つための遅延
    finally:
        driver.quit()

main()

コードの説明

initialize_driver() — ドライバの初期化
open_page() — 処理を開始するための最初のページを開く
collect_data() — 現在のページからデータを収集するための関数
click_next_button()「Next」 ボタンを見つけてクリックする関数。Falseを返す場合は、クロールの終了を意味する
main()内のループ — ページをクロールするメインのループ。「Next」ボタンが見つからない場合に終了する

2. ページ番号を使用したページネーション

サイトによっては、ページ番号のリンク(例:「1」、「2」、「3」など)がある場合がある。このような場合は、リンクのリストを収集し、それらを順にクリックすることで処理ができる。

コード例

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)

def go_to_page(driver, page_number):
    page_link = driver.find_element(By.LINK_TEXT, str(page_number))
    page_link.click()

def main():
    driver = initialize_driver()
    open_page(driver, "https://example.com/page1")

    try:
        total_pages = 5  # ページ数が分かっている場合に設定
        for page in range(1, total_pages + 1):
            collect_data(driver)
            if page < total_pages:  # 最後のページの後には進まない
                go_to_page(driver, page + 1)
                time.sleep(2)  # 次のページの読み込みを待つための遅延
    finally:
        driver.quit()

main()

コードの説明

go_to_page() — ページ番号で目的のリンクを見つけて移動する関数
main()内のループ — 総ページ数をtotal_pagesの変数で指定し、最後のページに到達するまで次のページに進む

3. 各ページのURLの変更

一部のサイトでは、各ページがURL内の番号で識別されるシンプルな構造を持っている(例: https://example.com/page/1https://example.com/page/2など)。このような場合、URLを変更するだけで目的のページをロードでき、要素を検索する必要がなくなる。

コード例

Python

from selenium import webdriver
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    items = driver.find_elements_by_class_name("item_class")
    for item in items:
        print(item.text)

def main():
    driver = initialize_driver()

    try:
        total_pages = 5  # ページ数が分かっている場合に設定
        base_url = "https://example.com/page/"
        
        for page_number in range(1, total_pages + 1):
            url = f"{base_url}{page_number}"
            open_page(driver, url)
            collect_data(driver)
            time.sleep(2)  # 次のページの読み込みを待つための遅延
    finally:
        driver.quit()

main()

コードの説明

変数base_url はページの基本となるURLを含む
ループはページ番号でURLを生成し、順番に各ページを開き、データを収集する。要素をクリックしないため、エラーが発生する可能性が最小限に抑えられる。

4. 最適化のためのヒント

  • 動的要素のクリックや待機を最小限にする: リンクやURLを使用するほうが、JavaScriptでロードされるボタンをクリックするよりも堅牢。
  • 最小遅延での待機タイマーを使用する: 新しいページに移動する際は、time.sleep(2)のような小さな遅延を使用して要素がロードされるのを待つが、それ以上長く待たない。
  • ページ全体がロードされた後にデータを収集する: ページのデータが完全にロードされていることを確認してから収集を開始する。 implicitly_waitを使用して要素を確実に検出しよう。
  • ログの記録: 現在のページ、エラー、成功した遷移を記録するログを導入しよう。 これにより、スクリプトの実行中の診断が簡単になる。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION