ChatGPTでカンタン!WEBスクレイピングで丼丸の情報をまとめる
※この記事は、丼丸のサイト情報の集め方の備忘録です。ついでに、ChatGPTを利用してPythonによるWEBスクレイピングのプログラムをつくる方法も紹介します。
まえがき
趣味で各地のCoCo壱番屋と丼丸の写真を撮っています。CoCo壱は調査して、丼丸はあえて場所を調べずに町中で出会ったときに写真をとるスタイルを楽しんでいました。ですが、近所の丼丸が閉店したのをきっかけに、丼丸のこともしっかり調査して効率的に撮影に出向いた方がいいのでは……と気持ちが傾いてきました。
CoCo壱のときは全店の情報を手作業でチェックしたのですがあまりにも大変だったので、今回は自動でできるようWEBスクレイピングのプログラムをつくることにします。せっかくなので、そのプログラム自体もChatGPTにつくってもらうことにしました。
スクレイピングをする際にChatGPTでできないこと
「せっかくChatGPTを使うなら、プログラミングなんかせずに直接結果を教えて貰えばよいのでは……」と思うかもしれません。ですが、ChatGPTではウェブサイトの内容を直接読み込むことはできません。初手からつまづきます。
そこで、ChatGPTのアドバイスに従って、ChatGPTにPythonでスクレイピングするコードを作成してもらうことにしました。
WEBスクレイピングの流れ
一般的なWEBスクレイピングの流れは次のとおりです。
アクセスするWebページのリストをつくる
対象のWebページにアクセスし、情報を取得する
取得したWebページを解析し、特定のデータを検索・抽出する
抽出したデータを整形し保存する
丼丸の店舗情報は全地域のページにあります。店舗ごとの情報は各都道府県(東京都は各区、区外)ごとにページ分けされまとめられていて、この全地域のページにリンクされています。
そこで、まず全地域のページにアクセスし各都道府県のページのURLリストをつくり(Step 1)、つぎに各都道府県のページにアクセスし、データを抽出し、テキスト形式で保存する(Step 2)という手順を踏むことにしました。
ChatGPTにお願い(その1)
各都道府県のページのURLリストを作成
WEBスクレイピングの手順1「アクセスするWebページのリストをつくる」ですが、このリストもスクレイピングでつくることにしました。
アクセスするのは全地域のページの1ページのみ。
このページから全都道府県のページへのリンクを拾ってきてもらいます。
ChatGPTとのやり取りはこんな感じです。
pip install requests beautifulsoup4
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)
1回リクエストしただけで、サンプルコードと実行までの手順に加え、コードの解説までつけてくれました。これを実行すれば、全都道府県+海外の丼丸の店舗のリストが手に入ります。ぐへへ。
少し補足です。
ライブラリのインストールはWindowsであればコマンドプロンプト上などで実行することになります。
私からChatGPTへのリクエストの際には、WEBサイトのソース(ブラウザ上で右クリックして「ページのソースを表示」などとすると見れる)から<Body>タグ内のソースをコピペして貼り付けています。この情報からサイトの構造を読み取ってコードを生成してくれています。
「ソースをコピペするのであれば、わざわざPythonを使わなくても良いのでは?」と思う方もいるかもしれません。実際、このStep1ではそのとおりなのです。ですが、次のStep2のときのように複数のページを読み込むときには、Pythonを使って自動で複数のページを読みに行くほうが圧倒的に便利です。
さらに補足です。
各地域の内、千葉県、埼玉県、神奈川県、都区外、兵庫県、大阪府に関しては、リンク先からさらにページが分かれて複数になっていました。これに関しては、今回は手作業で追加しました。
ChatGPTにお願い その2
各都道府県のページにアクセスし、データを抽出し、テキスト形式で保存
無事にURLのリストができたところで、いよいよ本丸のデータ抽出です。取得したい情報は各店舗の店舗名、住所、形態(持ち帰り専門 or イートイン可)の3つです。
これを取得するコードもChatGPTが一発でつくってくれました。やり取りはこんなかんじです。
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)
店舗名: 『北の魚河岸丼丸』(2号店)公園町店 <北海道>
住所: 北海道北見市公園町77-1
営業形態: 持ち帰り専門店
--------------------------------------------------
店舗名: 『北の魚河岸丼丸』三輪店 <北海道>
住所: 北海道北見市中央三輪4丁目511-5
営業形態: 持ち帰り専門店
--------------------------------------------------
以上のようにWEBスクレイピングの結果をテキスト形式で保存するコードをつくってくれました。
以下は補足です。
私からのリクエストの際、URLのリストは数店舗に省略しました。ChatGPTの文字制限をオーバーしたためです。また、URLのページ構造には、一例として北海道のページのものを載せておきました。それで十分だったようです。
以上で無事、全国+海外のすべての丼丸の情報を取得するコードをつくることができました。これによれば現在、311店舗の情報がサイトに掲載されています。ちなみに海外店はベトナムです。