本記事の目的
今までスクレイピングする際はエクセルのWEB URLから開くでテーブル構造の部分を取得してたんですがそれが出来ないサイトあり、Pythonでゴリゴリコード書いてやってみました
今回は食べログの東京都のラーメン屋さんのリストを取得します
たぶん一部変えれば別のサイトでもいけるはず
ライブラリ selenium
ブラウザを操作出来るseleniumを使用
参考情報
インストールコマンド
pip install selenium
seleniumのバージョンエラーについて
スクレイピングコード解説とコード
簡単な処理の解説
変数定義、ライブラリインポート→
対象URL(リストページ)をブラウザで開く→
食べログランキングからリスト取得(2ページ分取得)→
リストを1つずつ開きCSV化(htmlタグから取得)→
リストの処理すべて終了したらファイルを閉じる
# 変数・定数
file_name='ramen.csv'
target_url='https://tabelog.com/tokyo/rstLst/ramen/?SrtT=rt&Srt=D&sort_mode=1'
i = 0
# import
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import chromedriver_binary
# selenium 4.0 ↑
from selenium.webdriver.common.by import By
from time import sleep
# basic
import csv
chrome_options = Options()
# chrome_options.add_argument('--headless')
#driver = webdriver.Chrome(options=chrome_options)
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# URL開く
driver.get(target_url)
# 待機処理
sleep(3)
# # a - href 属性取得
HREF_LIST = []
while True:
HREFS = driver.find_elements(By.CSS_SELECTOR, "a.list-rst__rst-name-target.cpy-rst-name")
for HREF in HREFS:
HREF_TITLE = HREF.get_attribute("href")
HREF_LIST.append(HREF_TITLE)
print("[INFO] HREF_LIST :", HREF_LIST)
try:
driver.find_element(By.XPATH, '//li[@class="c-pagination__item" and position()=last()]/a').click()
i += 1
# とりあえず2ページ目で終了させる
if i == 2:
break
except:
break
# HEADER作成
with open(file_name, 'a', newline="") as f:
writer = csv.writer(f)
writer.writerow(["title", "review", 'shop_name', 'genre', 'address'])
# 個別URLを開く
for EACH_LIST in HREF_LIST:
driver.get(EACH_LIST)
sleep(1)
# タイトル取得
title = driver.find_element(By.XPATH, '//h2/span').text
print("[INFO] title :", title)
# 評価
try:
review = driver.find_element(By.CSS_SELECTOR, ".rdheader-rating__score-val>span").text
except:
review = str(0)
# テーブル取得
shop_name = driver.find_element(By.XPATH, '//tr/th[text()="店名"]/following-sibling::td/div/span').text
print("[INFO] 店名: ", shop_name)
# ジャンル
genre = driver.find_element(By.XPATH, '//tr/th[text()="ジャンル"]/following-sibling::td/span').text
print("[INFO] ジャンル: ", genre)
# 住所
address = driver.find_element(By.XPATH, '//tr/th[text()="住所"]/following-sibling::td/p').text
print("[INFO] 住所: ", address)
with open(file_name, 'a', newline="") as f:
writer = csv.writer(f)
writer.writerow([title, review, shop_name, genre, address])
# driver 閉じる
driver.quit()
取得結果
こんな感じでラーメン屋さんの情報が取れました