1. ナビゲーションの準備
冒険に出かける前に、正しいツールで準備しましょう:Seleniumと少しの工夫が必要です。Seleniumとブラウザドライバーの設定方法は既に知っている前提で、さあ始めましょう!
ドライバーの設定
from selenium import webdriver
# ブラウザドライバーを起動 (例: Chrome)
driver = webdriver.Chrome()
# 冒険の最初のページを開く
driver.get("http://example.com/start-page")
ここまでは標準的です―ブラウザを開いて開始ページをロードしました。でもここからが面白いところ:1ページに留まるのではなく、その隣のページにも行ってみたいですよね!
2. ページネーション: ページ巡り
ページを巡る一番簡単で親しみやすい方法はページネーションです。ページ下部にあるあの小さな数字を見たことがあるでしょう? それは道路標識のようなもの:「次の停車地はページ2です」と教えてくれます。
ページからのデータ抽出
旅を始める前に、現在のページから情報を収集したいですね。例えば、商品リストや記事のタイトルなど。
def extract_data():
# ページ上で興味のある要素を探す (例: タイトル)
titles = driver.find_elements_by_class_name("item-title")
for title in titles:
print(title.text) # テキストを出力。保存するのもアリ
extract_data()
以前の講義をサボっていた人には、このコードがページ上のクラスitem-titleを持つ全てのタイトルを見つけて、出力するものだと説明します。
次のページへのナビゲーション
データ収集が完了したら、次のステップに進む時間です。ページネーションは通常、次のページや前のページへのリンクボタンの形で表現されます。これらのボタンを見つけてクリックする必要があります。
def go_to_next_page():
try:
# 次のページのボタンを見つけてクリック
next_button = driver.find_element_by_link_text("Next")
next_button.click()
except NoSuchElementException:
# ボタンがない場合、最後に到達したことを意味します
print("ページリストの終わりです。")
この関数はテキスト「Next」を持つリンクを探します。見つかった場合、それをクリックして次のページに進みます。見つからなかった場合、ボットは終了を理解します...少なくともそのページシーケンスの中で。
3. ページ巡回のループ
完全な幸せのために何が欠けていますか? そう、ループです! これを1つの便利なループにまとめて、ボットがすべての利用可能なページをプロフェッショナルのように巡回できるようにしましょう。
while True:
extract_data() # 現在のページからデータを収集
go_to_next_page() # 次のページに進む
time.sleep(2) # サーバーを驚かせないための少しの休憩
これでボットはすべての「Next」ボタンがあるページを勇敢に巡ります。このコードはページがなくなるまで実行されます。リクエスト間の小さな休憩が重要です。スパマーは誰も好きではありません、特にウェブサイトの管理者。
4. 動的なインタラクション
皆さん、人生はこのページネーションの例のように簡単ではありません。稀にページは忍者のように振る舞い、スクロールするたびに動的にデータをロードします。でも大丈夫、これも対処可能です。
明示的な待機
待機機能を使うことで、必要な要素が利用可能になるまでコードを一時停止できます。これはコンテンツがすぐに読み込まれない場合に特に便利です。
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("要素が見つかりませんでした。")
この関数を使えば、ボットは動的にロードされるコンテンツと調和し、要素が利用可能になるのを待つことができます。
ページのスクロール
動的コンテンツを含む無限スクロールのような不思議なページでは、他の要素をロードするためにページを下にスクロールする必要があるかもしれません。
def scroll_down():
# JavaScriptを使って下にスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
JavaScriptスクリプトはスムーズな下方向スクロールを実現し、ページがコンテンツをロードする時間を与えます。この技術をループで使用すると、無限スクロールを巡回するのに役立ちます。
5. ヒントとトリック
この例を超えて、ボットが様々なシナリオに備えられるようにすることが重要です。
「Next」ボタンがない場合でも、ページ番号でのページネーションがある場合は、URLに直接番号を挿入する動的な方法を使用します。また、万が一、対象のサイトが忍者のように動作していくつかのページを隠してしまったら、スクリプトを調整して不測の事態に備えましょう。
GO TO FULL VERSION