【Python】食べログのURLからお店情報を抽出する
Python で食べログのURLからお店情報を抽出する
食べログのお店のURLをインプットとして、そのURLのWebページから以下6つの情報をスクレイピングして抽出するPythonプログラムを作ります。
- 店の名前
- ジャンル
- 食べログのスコア
- 昼の予算
- 夜の予算
- 所在地
使うライブラリ
以下2つのライブラリを使います。
- Requests
- BeautifulSoup
コーディング
※今回作ったソースコードは、本ページの最後にGitHubのリンクを載せていますのでご参照ください。
1. URLにGETを投げ、その結果のHTMLをBeautifulSoupに食わせる
まずは、対象の食べログのURLにリクエストを投げ、その結果を取得します。
以下のように書くだけです。
# htmlの抽出 try: response = requests.get(url) response.encoding = response.apparent_encoding bs = BeautifulSoup(response.text, 'html.parser') except: print("Error occured when extracting html from , from " + url)
2. お店の各情報を、BeautifulSoupで抽出する
店名の取得
店名は、クラス名が'display-name' であるタグの中の、'span'を参照することで取得できます。
restaurant_name = self.__extract_text(bs.find(class_='display-name').find('span'))
お店のジャンルの取得
食べログでは、1つのお店が複数のジャンルを持っていることがあります。
例えば、「イタリアン」「ワインバー」のような感じです。
今回は、複数のジャンルのうち最初に登場したものを抽出してみます。
ジャンルはテーブル形式(dt, dlなどのタグ)を使用して格納されています。
取得の仕方は以下のとおりです。
- クラス名が 'rdheader-info-data'というタグ配下で、クラス名が'rdheader-subinfo__item'という dl タグのリストを取得する。
- このdlタグのリスト内で、クラス名が 'rdheader-subinfoitem-title'というdt タグの値を見て、その値が 'ジャンル:'という文字列だった場合は、そのdtタグ内の クラス名が'linktreeparent-target-text'というタグにジャンル名が書かれている。
・・・日本語で書くと超分かりにくいので、コードを載せます。
# dtタグの値が 'ジャンル:' であるdlタグを探し、 # そのdlタグ内で、実際のジャンル名が書かれているタグ(class名が'linktree__parent-target-text')を抽出する。 target_dl_tags = bs.find(class_='rdheader-info-data').findAll('dl', {'class':'rdheader-subinfo__item'}) for dl_tag in target_dl_tags: dt_tag = self.__extract_text(dl_tag.find('dt', {'class':'rdheader-subinfo__item-title'})) genre = "" if dt_tag == u'ジャンル:': genre = self.__extract_text(dl_tag.find(class_='linktree__parent-target-text')) break
食べログスコアの取得
食べログのスコアは、クラス名が 'rdheader-rating__score-val-dtl'というタグを見ると抽出できます。
score = self.__extract_text(bs.find(class_='rdheader-rating__score-val-dtl'))
夜の予算の取得
夜の予算は、クラス名が 'gly-b-dinner'というタグを見ると抽出できます。
dinner_budget = self.__extract_text(bs.find(class_='gly-b-dinner'))
昼の予算の取得
昼の予算は、クラス名が 'gly-b-lunch'というタグを見ると抽出できます。
lunch_budget = self.__extract_text(bs.find(class_='gly-b-lunch'))
店の所在地の取得
所在地の情報は、クラス名が'rstinfo-table__address'というタグを見ると抽出できます。
address = self.__extract_text(bs.find(class_='rstinfo-table__address'))
3. 結果を表示する
上記2 で抽出した情報を表示すれば、完成です。
さいごに
このプログラムの使用用途としては、自分の好きなお店のURLリストを作っておき、そこからこのプログラムを使用してお店情報(のリスト)を抽出します。抽出したお店の情報(のリスト)をExcelファイルに出力し、それをGoogleマップに食わせることで、マップ上にお店をプロットすることができます。
この、「自分の好きなお店のURLリストを作っておき、そこからこのプログラムを使用してお店情報(のリスト)を抽出」の部分だけを作ったソースコードをこちらに載せています。