見出し画像

ChatGPTでカンタン!WEBスクレイピングで丼丸の情報をまとめる

※この記事は、丼丸のサイト情報の集め方の備忘録です。ついでに、ChatGPTを利用してPythonによるWEBスクレイピングのプログラムをつくる方法も紹介します。

まえがき

趣味で各地のCoCo壱番屋と丼丸の写真を撮っています。CoCo壱は調査して、丼丸はあえて場所を調べずに町中で出会ったときに写真をとるスタイルを楽しんでいました。ですが、近所の丼丸が閉店したのをきっかけに、丼丸のこともしっかり調査して効率的に撮影に出向いた方がいいのでは……と気持ちが傾いてきました。
CoCo壱のときは全店の情報を手作業でチェックしたのですがあまりにも大変だったので、今回は自動でできるようWEBスクレイピングのプログラムをつくることにします。せっかくなので、そのプログラム自体もChatGPTにつくってもらうことにしました。


スクレイピングをする際にChatGPTでできないこと

「せっかくChatGPTを使うなら、プログラミングなんかせずに直接結果を教えて貰えばよいのでは……」と思うかもしれません。ですが、ChatGPTではウェブサイトの内容を直接読み込むことはできません。初手からつまづきます。

直接スクレイピングするようお願いしたら、できないと断られてしまいました……。

そこで、ChatGPTのアドバイスに従って、ChatGPTにPythonでスクレイピングするコードを作成してもらうことにしました。

直接スクレイピング(左)はできないのでPythonのコードを作成(右)することに
(と、ChatGPTにアドバイスされました)

WEBスクレイピングの流れ

一般的なWEBスクレイピングの流れは次のとおりです。

  1. アクセスするWebページのリストをつくる

  2. 対象のWebページにアクセスし、情報を取得する

  3. 取得したWebページを解析し、特定のデータを検索・抽出する

  4. 抽出したデータを整形し保存する

丼丸の店舗情報は全地域のページにあります。店舗ごとの情報は各都道府県(東京都は各区、区外)ごとにページ分けされまとめられていて、この全地域のページにリンクされています。

丼丸の店舗情報のページ構成

そこで、まず全地域のページにアクセスし各都道府県のページのURLリストをつくり(Step 1)、つぎに各都道府県のページにアクセスし、データを抽出し、テキスト形式で保存する(Step 2)という手順を踏むことにしました。

ChatGPTにお願い(その1)
各都道府県のページのURLリストを作成

WEBスクレイピングの手順1「アクセスするWebページのリストをつくる」ですが、このリストもスクレイピングでつくることにしました。
アクセスするのは全地域のページの1ページのみ。
このページから全都道府県のページへのリンクを拾ってきてもらいます。
ChatGPTとのやり取りはこんな感じです。

私:
下記のURLを読み込み、地域(area)にリンクされているURLのリストを取得するPythonコードを作成してください。

https://sasafune.co.jp/browse/?area=%E5%8C%97%E6%B5%B7%E9%81%93 """URLのページ構造"""
<body class="
~ 中略 ~
</body>

ChatGPT:
ウェブスクレイピングによって指定のデータを取得する場合、BeautifulSoupやSeleniumなどのライブラリを利用できます。BeautifulSoupは主に静的ページの解析、Seleniumは動的ページ(JavaScriptで生成された内容がある場合)の解析に使用されます。

今回は指定されたURLからリンクされた「地域(area)」のURLリストを取得するためのサンプルコードを示します。

まずは、これらのライブラリをインストールしてください。

pip install requests beautifulsoup4

ChatGPT:
次に、Pythonコードを実行します:

import requests
from bs4 import BeautifulSoup

# ターゲットURL
url = "https://sasafune.co.jp/browse/?area=%E5%8C%97%E6%B5%B7%E9%81%93"

# ページの内容を取得
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

# 地域(area)にリンクされているURLを取得
area_links = []
for link in soup.find_all("a", class_="area"):
    area_links.append(link.get("href"))

# リンクの出力
for link in area_links:
    print(link)

ChatGPT:
コードの説明
requests.get() で指定したURLのHTMLコンテンツを取得します。
BeautifulSoup を使用して、HTMLを解析し、ページ内のリンクを抽出します。
soup.find_all() で、リンクタグ(<a>)の中からクラスが "area" のものだけを取得します。
最終的に、リンク先のURLを取得してリストに追加し、それを出力します。


このコードを実行することで、「地域」に関連するすべてのURLがリストとして取得され、表示されます。

1回リクエストしただけで、サンプルコードと実行までの手順に加え、コードの解説までつけてくれました。これを実行すれば、全都道府県+海外の丼丸の店舗のリストが手に入ります。ぐへへ。

少し補足です。
ライブラリのインストールはWindowsであればコマンドプロンプト上などで実行することになります。
私からChatGPTへのリクエストの際には、WEBサイトのソース(ブラウザ上で右クリックして「ページのソースを表示」などとすると見れる)から<Body>タグ内のソースをコピペして貼り付けています。この情報からサイトの構造を読み取ってコードを生成してくれています。
「ソースをコピペするのであれば、わざわざPythonを使わなくても良いのでは?」と思う方もいるかもしれません。実際、このStep1ではそのとおりなのです。ですが、次のStep2のときのように複数のページを読み込むときには、Pythonを使って自動で複数のページを読みに行くほうが圧倒的に便利です。

さらに補足です。
各地域の内、千葉県、埼玉県、神奈川県、都区外、兵庫県、大阪府に関しては、リンク先からさらにページが分かれて複数になっていました。これに関しては、今回は手作業で追加しました。

ChatGPTにお願い その2
各都道府県のページにアクセスし、データを抽出し、テキスト形式で保存

無事にURLのリストができたところで、いよいよ本丸のデータ抽出です。取得したい情報は各店舗の店舗名、住所、形態(持ち帰り専門 or イートイン可)の3つです。
これを取得するコードもChatGPTが一発でつくってくれました。やり取りはこんなかんじです。

私:
下記のURLリスの各ページにある店舗情報を読み込み、店舗名(name)、住所(adress)、営業形態(takeaway)を取得し出力結果をテキストファイルで保存するためのPythonコードを作成してください。URLのリストとページのURLの構造を次に示します。

URLのリスト:
https://sasafune.co.jp/browse?area=%E5%8C%97%E6%B5%B7%E9%81%93 https://sasafune.co.jp/browse?area=%E5%AE%AE%E5%9F%8E%E7%9C%8C https://sasafune.co.jp/browse?area=%E5%B2%A9%E6%89%8B%E7%9C%8C https://sasafune.co.jp/browse?area=%E7%A6%8F%E5%B3%B6%E7%9C%8C
~以下略

"""URLのページ構造"""
<body class= ~以下略

ChatGPT:
店舗情報を取得するためのPythonコードを次に示します。このコードは requests および BeautifulSoup ライブラリを使用して、指定されたURLのリストから店舗名、住所、営業形態を抽出します。

import requests
from bs4 import BeautifulSoup

# 対象のURLリスト
url_list = [
    'https://sasafune.co.jp/browse?area=%E5%8C%97%E6%B5%B7%E9%81%93',
    'https://sasafune.co.jp/browse?area=%E5%AE%AE%E5%9F%8E%E7%9C%8C',
    'https://sasafune.co.jp/browse?area=%E5%B2%A9%E6%89%8B%E7%9C%8C',
    'https://sasafune.co.jp/browse?area=%E7%A6%8F%E5%B3%B6%E7%9C%8C'
]

# 店舗情報を保存するリスト
shop_data = []

# 各URLから情報を抽出
for url in url_list:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 店舗リストを取得
    shop_list = soup.find_all('div', class_='item')
    
    for shop in shop_list:
        # 店舗名
        name = shop.find('div', class_='name').text.strip()

        # 住所
        address = shop.find('div', class_='address').text.strip()

        # 営業形態(持ち帰りかどうか)
        takeaway = shop.find('div', class_='takeaway').text.strip()

        # データを保存
        shop_data.append({
            'name': name,
            'address': address,
            'takeaway': takeaway
        })

# 結果を表示
for shop in shop_data:
    print(f"店舗名: {shop['name']}")
    print(f"住所: {shop['address']}")
    print(f"営業形態: {shop['takeaway']}")
    print('-' * 50)

ChatGPT:
コードの説明:
1. url_list: 対象のURLをリストとして保存しています。
2. requests.get() を使用して、それぞれのページのHTMLを取得します。
3. BeautifulSoup でHTMLを解析し、店舗情報(店舗名、住所、営業形態)を抽出します。
4. 各店舗情報を辞書として shop_data に保存し、sasafune_store_info.txt というファイルに、取得した店舗情報を行ごとに保存するようにしました。
5. ファイルは utf-8 エンコーディングで保存されるため、日本語が正しく表示されます。

実行結果:
各店舗の情報が次のように表示されます。

店舗名: 『北の魚河岸丼丸』(2号店)公園町店 <北海道>
住所: 北海道北見市公園町77-1
営業形態: 持ち帰り専門店
--------------------------------------------------
店舗名: 『北の魚河岸丼丸』三輪店 <北海道>
住所: 北海道北見市中央三輪4丁目511-5
営業形態: 持ち帰り専門店
--------------------------------------------------

ChatGPT:
このコードを実行すれば、複数のページから店舗情報を効率的に取得できます。

以上のようにWEBスクレイピングの結果をテキスト形式で保存するコードをつくってくれました。
以下は補足です。
私からのリクエストの際、URLのリストは数店舗に省略しました。ChatGPTの文字制限をオーバーしたためです。また、URLのページ構造には、一例として北海道のページのものを載せておきました。それで十分だったようです。

以上で無事、全国+海外のすべての丼丸の情報を取得するコードをつくることができました。これによれば現在、311店舗の情報がサイトに掲載されています。ちなみに海外店はベトナムです。

いいなと思ったら応援しよう!