LoginSignup
1
6

Pythonを使ってスクレイピングしてみる

Last updated at Posted at 2024-05-01

本記事の目的

今までスクレイピングする際はエクセルのWEB URLから開くでテーブル構造の部分を取得してたんですがそれが出来ないサイトあり、Pythonでゴリゴリコード書いてやってみました

今回は食べログの東京都のラーメン屋さんのリストを取得します
たぶん一部変えれば別のサイトでもいけるはず

image.png

ライブラリ 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()


取得結果

こんな感じでラーメン屋さんの情報が取れました

image.png

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6