
26 開発日記8/19【不動産情報収集用クローラー開発: チェックボックス選択機能の実装】
おはようございます!TechCommitメンバーの友季子です。今回は、作成途中の不動産会社のSUMOさんのクローラーについて紹介します。このクローラーでは、指定したキーワードに基づいて、SUMOさんの物件検索ページ内のチェックボックスを自動的に選択する機能を実装しています。PythonとSeleniumを使って、実際に動かすことができるコードを解説します!
1.作成途中のコード
以下に、SUMOさんの賃貸情報サイトから特定の路線に関連するチェックボックスを自動で選択するためのコードを紹介します。一行ごとに詳細なコメントを付けて解説します。
from selenium import webdriver # Selenium WebDriverを使用してブラウザを自動操作するためのモジュールをインポート
from selenium.webdriver.common.by import By # 要素を特定するためのモジュールをインポート
from selenium.webdriver.chrome.service import Service # ChromeDriverを管理するサービスオブジェクトを作成するためのモジュールをインポート
from selenium.webdriver.chrome.options import Options # Chromeブラウザのオプションを設定するためのモジュールをインポート
from selenium.webdriver.support.ui import WebDriverWait # WebDriverの待機処理をサポートするモジュールをインポート
from selenium.webdriver.support import expected_conditions as EC # 指定した条件を満たすまで待機するためのモジュールをインポート
# WebDriverのパスを設定
driver_path = 'C:\\Users\\yukik\\xx\\chromedriver.exe' # ChromeDriverの実行ファイルが置かれているパスを指定
# サービスオブジェクトを作成
service = Service(driver_path) # ChromeDriverのサービスオブジェクトを作成し、WebDriverの起動に使用
# オプションを設定して、ヘッドレスモードで実行(ブラウザを表示したい場合はこの行をコメントアウト)
chrome_options = Options() # Chromeブラウザの起動オプションを設定するオブジェクトを作成
#chrome_options.add_argument('--headless') # ヘッドレスモード(GUIなし)でChromeを起動するオプションを追加(コメントアウトすればブラウザが表示される)
# WebDriverを起動
driver = webdriver.Chrome(service=service, options=chrome_options) # 上記で設定したサービスオブジェクトとオプションを使ってChromeブラウザを起動
# ターゲットページを開く
url = "https://suumo.jp/chintai/hokkaido_/ensen/" # Suumoの賃貸情報サイトの特定ページURLを設定
driver.get(url) # 指定されたURLを開く
# ページが完全に読み込まれるのを待つ
wait = WebDriverWait(driver, 20) # 最大20秒間待機し、指定した条件が満たされるのを待つ
wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="js-gotoEkiForm"]/div[1]/table/tbody/tr'))) # ページ内の特定の要素が読み込まれるまで待機
# ターミナルから検索文字を入力
search_keyword = input("検索する文字列を入力してください: ") # ユーザーに検索する文字列を入力してもらう
# テーブル内のすべてのチェックボックスを含むリスト要素を取得
checkboxes = driver.find_elements(By.XPATH, '//*[@id="js-gotoEkiForm"]/div[1]/table/tbody/tr/td/div/ul/li') # ページ内の指定されたXPathに一致する全てのチェックボックス要素を取得
# 部分一致した要素のチェックボックスをクリック
for checkbox in checkboxes: # 取得したチェックボックスのリストをループ処理
label = checkbox.text # 各チェックボックスのラベルテキストを取得
if search_keyword in label: # 入力された検索キーワードがラベルに含まれている場合
driver.execute_script("arguments[0].click();", checkbox.find_element(By.XPATH, './/input[@type="checkbox"]')) # チェックボックスをJavaScriptを使ってクリック
print(f"'{label}' に部分一致したチェックボックスをクリックしました。") # 成功メッセージをターミナルに出力
# 必要に応じて他の操作を追加(例: 検索ボタンをクリックするなど)
# ブラウザを閉じる
#driver.quit() # ブラウザを閉じる(コメントアウトされているので自動では閉じられない)
2. コードの詳細解説
このセクションでは、前述のコードについて、行ごとに詳細な解説を行います。各行がどのような役割を果たしているのかを理解することで、Seleniumを使用したWebスクレイピングやブラウザの自動化の仕組みを深く理解できるようになります。
2.1 必要なライブラリのインポート
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
seleniumライブラリ: ブラウザの自動操作やWebページのスクレイピングを行うためのライブラリです。
webdriver: ブラウザを操作するためのインターフェースを提供します。
By: Webページ内の要素を特定するためのさまざまな方法を提供します(例: ID、クラス名、XPathなど)。
Service: ChromeDriverのサービスオブジェクトを作成し、WebDriverの起動に使用します。
Options: Chromeブラウザの起動オプションを設定するためのオブジェクトです。
WebDriverWait: Webページが特定の状態になるまで待機する機能を提供します。
expected_conditions as EC: 特定の条件が満たされるまで待機するためのモジュールです。
2.2 WebDriverのパス設定
driver_path = 'C:\\Users\\yukik\\xxx\\chromedriver.exe' # 正しいパスに変更
driver_path: chromedriver.exeのパスを指定します。ChromeDriverは、SeleniumがChromeブラウザを操作するために必要です。このパスは、ユーザーのシステム環境に合わせて正確に指定する必要があります。
2.3 サービスオブジェクトの作成
service = Service(driver_path) # ChromeDriverのサービスオブジェクトを作成し、WebDriverの起動に使用
Serviceオブジェクト: driver_pathで指定したChromeDriverを使用するためのサービスを作成します。これにより、WebDriverがChromeDriverを使用してブラウザを操作できるようになります。
2.4 Chromeブラウザのオプション設定
chrome_options = Options() # Chromeブラウザの起動オプションを設定するオブジェクトを作成 #chrome_options .add_argument('--headless') # ヘッドレスモード(GUIなし)でChromeを起動するオプションを追加
Optionsオブジェクト: Chromeブラウザの起動時の設定を管理します。
ヘッドレスモード: --headlessオプションを有効にすると、Chromeがバックグラウンドで実行されます。これにより、GUIを表示せずに処理を行うことができます。今回は、デバッグのためにコメントアウトされていますが、通常はテストや自動化で便利です。
2.5 WebDriverの起動
driver = webdriver.Chrome(service=service, options=chrome_options) # 上記で設定したサービスオブジェクトとオプションを使ってChromeブラウザを起動
webdriver.Chrome: ServiceオブジェクトとOptionsオブジェクトを使って、Chromeブラウザを起動します。これで、Seleniumがブラウザを操作する準備が整います。
2.6 ターゲットページを開く
url = "https://suumo.jp/chintai/hokkaido_/ensen/" # Suumoの賃貸情報サイトの特定ページURLを設定 driver.get(url) # 指定されたURLを開く
url: 対象のWebページのURLを設定します。この例では、Suumoの北海道エリアの路線情報ページを指定しています。
driver.get(url): 設定されたURLをChromeブラウザで開きます。
2.7 ページが完全に読み込まれるのを待つ
wait = WebDriverWait(driver, 20) # 最大20秒間待機し、指定した条件が満たされるのを待つ wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="js-gotoEkiForm"]/div[1]/table/tbody/tr'))) # ページ内の特定の要素が読み込まれるまで待機
WebDriverWait: 最大で20秒間、指定された条件が満たされるのを待機します。待機する理由は、ページの要素が完全に読み込まれるまで次の操作を行わないようにするためです。
untilメソッド: 特定の要素がDOMに存在するまで待機します。この例では、XPathを使用して特定のテーブル要素が存在するまで待機しています。
2.8 ターミナルから検索文字を入力
search_keyword = input("検索する文字列を入力してください: ") # ユーザーに検索する文字列を入力してもらう
input(): ターミナルからユーザーに入力を促し、その入力をsearch_keyword変数に格納します。このキーワードを使用して、後の処理でチェックボックスを選択します。
2.9 チェックボックスの取得
checkboxes = driver.find_elements(By.XPATH, '//*[@id="js-gotoEkiForm"]/div[1]/table/tbody/tr/td/div/ul/li') # ページ内の指定されたXPathに一致する全てのチェックボックス要素を取得
find_elements: 指定されたXPathに一致するすべての要素をリスト形式で取得します。この例では、特定のテーブル内にあるすべてのチェックボックス要素を取得しています。
2.10 チェックボックスをクリック
for checkbox in checkboxes: # 取得したチェックボックスのリストをループ処理 label = checkbox.text # 各チェックボックスのラベルテキストを取得 if search_keyword in label: # 入力された検索キーワードがラベルに含まれている場合 driver.execute_script("arguments[0].click();", checkbox.find_element(By.XPATH, './/input[@type="checkbox"]')) # チェックボックスをJavaScriptを使ってクリック print(f"'{label}' に部分一致したチェックボックスをクリックしました。") # 成功メッセージをターミナルに出力
forループ: 取得したすべてのチェックボックスをループ処理します。
checkbox.text: チェックボックスのラベル(テキスト)を取得します。
if search_keyword in label: ユーザーが入力した検索キーワードがラベルに含まれている場合、そのチェックボックスをクリックする処理を行います。
driver.execute_script: JavaScriptを実行して、チェックボックスをクリックします。通常のclick()メソッドではうまく動作しない場合でも、JavaScriptを使用することで確実にクリックが実行されます。
2.11 ブラウザの終了
#driver .quit() # ブラウザを閉じる(コメントアウトされているので自動では閉じられない)
driver.quit(): ブラウザを完全に閉じるコマンドです。コメントアウトされていますが、不要になったら実行することでリソースを解放できます。
3. コードの流れ
必要なライブラリをインポートして、WebDriverの環境を設定します。
指定されたURLのWebページを開き、完全に読み込まれるまで待機します。
ユーザーがターミナルから入力したキーワードに基づいて、部分一致するチェックボックスを探します。
見つかったチェックボックスを自動的にクリックします。
すべての処理が完了したら、必要に応じてブラウザを閉じます。
これにより、SuumoのWebページ上で特定の路線に関連するチェックボックスを自動的に選択することができます。
4.今後の計画
このスクリプトはまだ作成中で、今後はDjangoを使用してWebアプリ化する予定です。Webアプリにすることで、ユーザーがWebインターフェースを通じてチェックボックスの選択やデータの取得をより簡単に行えるようにするつもりです。興味があれば、ぜひ今後の進展を楽しみにしていてくださいねー