1. 「次へ」ボタンの使用
サイトに次のページに移動するための「次へ」ボタンやリンクがある場合は、そのボタンをクリックするためのループを設定し、ボタンが利用可能な限りクリックを続けられるよ。
コード例
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」など)がある場合がある。このような場合は、リンクのリストを収集し、それらを順にクリックすることで処理ができる。
コード例
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/1、https://example.com/page/2など)。このような場合、URLを変更するだけで目的のページをロードでき、要素を検索する必要がなくなる。
コード例
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を使用して要素を確実に検出しよう。 - ログの記録: 現在のページ、エラー、成功した遷移を記録するログを導入しよう。 これにより、スクリプトの実行中の診断が簡単になる。
GO TO FULL VERSION