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

# 本記事の目的

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

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/8eb77145-ef60-9771-ac49-36a68d1e2d88.png)



# ライブラリ selenium

ブラウザを操作出来る**selenium**を使用
参考情報

https://enginiya.com/entry/selenium-introduction-with-ptyhon

インストールコマンド

```shell
pip install selenium
```

seleniumのバージョンエラーについて

https://yuki.world/python-chrome-driver-version-error/

# スクレイピングコード解説とコード

## 簡単な処理の解説
変数定義、ライブラリインポート→
対象URL（リストページ）をブラウザで開く→
食べログランキングからリスト取得（2ページ分取得）→
リストを1つずつ開きCSV化（htmlタグから取得）→
リストの処理すべて終了したらファイルを閉じる

```python
# 変数・定数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/523cbda1-b21e-5e35-53bb-0ea9cd438cb5.png)