yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。
selenium-logo-A1B53CEFB0-seeklogo.com

Selenium・Python・GoogleChromeを使って食べログで渋谷の一位の店の名前とURLを取得する(Seleniumインストール・XPATH)

2022-07-29

Seleniumとは、GUI操作をコードで実行できるツール

本来はWebテスト目的っぽいが、
APIが提供されていないサイトでも操作を自動化できるし、何より定型作業をSeleniumでコード化しておけば仕事が捗る

API操作に比べて時間がかかるが、Seleniumが自動操作している間の時間を有効活用できる


今回は、食べログで渋谷駅1位のお店の名前とURLを取得してみる

現在食べログはAPI提供をしていません
API提供をしていないということは、多分「Webスクレイピングとかするなよ」ということだと思うので、Seleniumでの自動アクセスをやりすぎると怒られるかもしれません、自己責任でほどほどにお願いします

Seelniumのインストール

Pythonは今回3.8.7を使う

 
% python -V
Python 3.8.7

Seleniumを使うにはインストールすべきものが2つ
SeleniumとWeb Driver

まずは、Seleniumをインストール

% pip install selenium

次にDriverをインストールするが、Driverはお使いのブラウザとバージョンを合わせる必要がある
今回自分は、Google Chromeを利用
Macの場合は、Google Chromeのバージョンは以下のコマンドで調べられるのでバージョンも調べておく

% /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
Google Chrome 103.0.5060.134

先程調べた、ブラウザと同じバージョンのDriverをインストールする
GoogleChromeの場合は、「chromedriver-binary」をインストールする
ドンピシャのバージョンがなければ、一個古いバージョンををインストールする

% pip install chromedriver-binary==103.0.5060.134

これで必要なものは揃った!

コード全体と実行結果

以下公式ドキュメントを参考に、やりたいことをコード化していく
https://selenium-python.readthedocs.io/getting-started.html#simple-usage

Seleniumは、基本的に、「find_element」で要素を指定して、指定した要素に対してクリックとかアクションを実行する、という段取りで操作する
要素を指定する方法はいくつかあるが、今回は一番簡単な「XPATHで指定する方法」を採用

  • XPATHでの指定は、HTMLの階層フルパスを指定するものなので、GUI変更に弱いというデメリットもある
  • もともとSeleniumはGUI操作をコード化するものなのでGUI変更に弱いが、IDやCSS_SELECTORで直接指定した方がXPATHで指定するよりマシかも

参考:3.1. Interacting with the page


※ XPATH取得方法についてはこちら を参照ください
GoogleChromeでのXPATHの取得方法


コードの全体は以下

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# ドライバ設定
options = Options()
options.add_argument('--headless') # ブラウザ画面を開かずに実行する
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(10) # クリックできるようになるまで待機する(暗黙的待機)

# tabelogを開く
driver.get("https://tabelog.com/")

# 渋谷を検索
element = driver.find_element(By.XPATH, "//*[@id='sa']")
element.send_keys("渋谷")
element.send_keys(Keys.RETURN)

# ランキングタブをクリック
element = driver.find_element(By.XPATH, "//*[@id='rstlst-access']/ul/li[2]/a")
element.click()

# 1位のお店の名前とURLを表示
element = driver.find_element(By.XPATH, "//*[@id='container']/div[15]/div[4]/div/div[6]/div[1]/div[2]/div/div[1]/div/div[3]/h3/a")
print(element.text)
print(element.get_attribute("href"))

出力結果は以下

% python selenium_work.py
ラチュレ
https://tabelog.com/tokyo/A1303/A130301/13198692/

コードの説明

それぞれやっていることをGUI画面と共に見ていく

必要モジュールをインポートした直後に最初にやっているのは、ドライバの設定
「implicitly_wait」はページがロードされるまで待機時間の設定

  • 今回は「暗黙的な待機」として一括で設定しているが、きちんとやるなら「明示的な待機 」として設定した方が、無駄な待機時間が省略できるはず
  • 参考:暗黙的な待機明示的な待機

    options = Options()
    options.add_argument('--headless') # ブラウザ画面を開かずに実行する
    driver = webdriver.Chrome(options=options)
    driver.implicitly_wait(10) # クリックできるようになるまで待機する(暗黙的待機)
    

    ドライバの設定ができたらGUI操作をコード化していく

    まずは、食べログのサイトを開く

    driver.get("https://tabelog.com/")
    

    検索窓を指定し、「渋谷」と入力、エンターキーを押す

    element = driver.find_element(By.XPATH, "//*[@id='sa']")
    element.send_keys("渋谷")
    element.send_keys(Keys.RETURN)
    

    20220729_selenium_python_1

    ランキングタブを指定してクリック

    element = driver.find_element(By.XPATH, "//*[@id='rstlst-access']/ul/li[2]/a")
    element.click()
    

    20220729_selenium_python_2

    検索結果が表示されたら、1位のお店の名前とURLをPrintする

    element = driver.find_element(By.XPATH, "//*[@id='container']/div[15]/div[4]/div/div[6]/div[1]/div[2]/div/div[1]/div/div[3]/h3/a")
    print(element.text)
    print(element.get_attribute("href"))
    

    20220729_selenium_python_3

    以上。