A little bit of everything

元・情報系大学院生の備忘録

【Python】食べログのURLからお店情報を抽出する

Python食べログのURLからお店情報を抽出する

食べログのお店のURLをインプットとして、そのURLのWebページから以下6つの情報をスクレイピングして抽出するPythonプログラムを作ります。

  • 店の名前
  • ジャンル
  • 食べログのスコア
  • 昼の予算
  • 夜の予算
  • 所在地

使うライブラリ

以下2つのライブラリを使います。

  • Requests
    • Requestsとは:HTTPリクエストを投げるためのライブラリです。詳細は公式ページ参照。
    • 今回の用途:食べログのお店のURLにGETリクエストを投げ、その結果(WebページのHTMLファイル)を受け取るために使用します。
  • BeautifulSoup
    • BeautifulSoupとは:HTMLやXMLから情報を抜き出すためのライブラリです。詳細は公式ページ参照。
    • 今回の用途:Requestsのライブラリを使ってとってきたHTMLファイルから、お店の情報を抜き出すために使用します。

コーディング

※今回作ったソースコードは、本ページの最後に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などのタグ)を使用して格納されています。
取得の仕方は以下のとおりです。

  1. クラス名が 'rdheader-info-data'というタグ配下で、クラス名が'rdheader-subinfo__item'という dl タグのリストを取得する。
  2. この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リストを作っておき、そこからこのプログラムを使用してお店情報(のリスト)を抽出」の部分だけを作ったソースコードをこちらに載せています。

github.com