LoginSignup
1
1

More than 1 year has passed since last update.

delika Advent Calendar 2022

はじめに

ぼくのはたらく場所のちかくには3軒のごはんどころがある。

1.ばんのう定食屋「やよい軒」
2.早さ最つよ「すき家」
3.コスパ神「スシロー」

ぼくはこの3軒をループする。

そんなある日、ぼくに突然の通知が来た。

あなたはメタボリックシンドロームです

これは店のせいではない。
完全に、ぼくのせいだ。
 あの券売機に表示される「肉」、
 あのタブレット端末が誘惑する「特盛」、
 あのまわって誘惑する「べつばらデザート」。

いったいどれだけのカロリーをせっしゅしているというのだ。

delikaにまとめてみよう。

カロリーデータの取得 やよい軒

「やよい軒 カロリー」で検索しトップに表示されたページへいってみる。
 https://www.yayoiken.com/menu_list/info/9

うーん、アレルギー情報だけで、カロリー情報はないか?とおもったら、
真ん中の「栄養成分情報」のタブにありました。
スクリーンショット 2022-12-23 11.26.12.png
おー、さすが。しかも、テーブルで一覧になっている。ありがたや。
手作業でのスクレイピングを試行。

このページを「名前を付けて保存」し、保存されたhtmlファイルをExcelで読み込む。

A01.png

うまく読み込めたようだ。ただ、A3,A4,A5セルのように、結合セルになってしまっているので、結合を解除する。
セル全体を選択して、右クリックし「セルの書式設定」を選択する。
A02.png

表示される「セルの書式設定」ダイアログの「文字の制御」の「セルを結合する」のチェックを外して「OK」を押す。
A03.png

セルの結合が解除された。
A04.png

B1,B2セルが空欄なので「ご飯」「種類」と入力した。
A05.png
A06.png

A2,A4,A5セルなど、結合解除により空欄になってしまっていることに気づいた。
上のセルの値で埋めたい。

こちらを参考にやってみる。

Ctrl+Aで全体を選択する。
A07.png

Ctrl+Gを押して「ジャンプ」ダイアログを表示させ、「セルを選択」を押す。
A08.png

「選択オプション」ダイアログで「空白セル」のラジオボタンを押して「OK」を押す。
A09.png

空白セルだけが選択された。
A10.png

A2セルに「=A1」として一つ上のセルを選択し、ここでCtrl+Enterを押す。
Ctrl+Enterにより、選択されたセルに同じものが入力される。
A11.png

A4,A5セルにはA3セルの値が、A7,A8セルにはA6セルの値が、A10,A11セルにはA9セルの値が入った。
A12.png

2行目を削除する。
A14.png

このシートをCSV形式で保存する。
A13.png

保存したCSVファイルをテキストエディタで開いてみる
A15.png

やよい軒のデータは、うまくできているようだ。

やよい軒のデータのdelikaへの登録

サインアップする。

「Sign up」を押して登録作業を行う。
B01.png

「Proceed」を押す。
B02.png

GithubかEmailでサインアップできるようだ。Emailでやってみる。
B03.png

Emailアドレスを入力して、Send verification codeを押す。
届いた verification codeを入力して、パスワードを入力して、国を選び、Createを押す。
B04.png
B05.png

Agreeを押す
B06.png

User Nameを入力してUpdateを押す。
B07.png

FreeプランとProプランがある。
B08.png

登録が完了した。黒い帯の中にあるDocsを押してみる
B09.png

ドキュメントを参照できる。
B10.png
B11.png

黒い帯の中にあるExploreを押してみる
B09.png

みなさんがアップされているデータを参照できる。
B09-1.png

黒い帯の左側の「delika」を押してみる。自分のデータセットが参照できるようだ。
Datasetの右の+を押す。
B12.png

B17.png

Dataset Nameを入力する。16文字を超えてしまったようだ。
B13.png

16文字以内にする。
B14.png

DatasetType と Licenseを選ぶ。
B15.png
B16.png

Createを押す
B18.png

生成されたようだ。
B19.png

Update Filesを押す。灰色の領域にCSVファイルをドロップする。
B20.png

CSVファイルが読み込まれた。
B21.png

B22.png

Show column detailsを押す。
B24.png

詳細が表示された
B25.png
B26.png

Show example queryを押す
B28.png

クエリーの入力画面が表示される
B29.png

以下のクエリーが入力されていた。
B30.png

Run Queryを押す。
B31.png

Resultを押す。おー。ちゃんと抽出できた。
B32.png
B32-1.png

メニューに「肉」の文字があるものを抽出する。
C01.png
カロリー高い。
C02.png

メニューに「魚」の文字があるものを抽出する。
C03.png
魚を選べば、1000Kcalは超えないようだ。
C04.png

カロリー順に並べてみようとしたが、Freeプランではできないようだ。
C05.png

800Kcal未満を抽出してみる。しょうが鍋定食がカロリー低くて、よさそうだ。
C06.png
C08.png

とういうわけで、やよい軒の定食のカロリーデータをdelikaに登録できた。

カロリーデータの取得とdelikaへの取り込み すき家

次はすき家 PDF形式だ。

H01.png

どうしたものか、PDF。Excelでとりこんでみよう。
「データ」-「データの取得」-「ファイルから」-「PDFから」を選ぶ。
D04.png
PDFファイルを選ぶ。
D05.png
ナビゲーターが表示される
D06.png
Table001を選ぶ。おお、良さそう。「読み込み」を押す
D07.png
D08.png
読み込まれた。でもB列が空欄。下の方の行をみてみる。
D09.png
んん?どうなってるの?
D10.png
元のPDFをみてみる。これは・・・w。すきすきセット(カットリンゴつき)
D11.png

「すきすきセット(カットリンゴつき)」はC列に手動でコピーして移動する。
D12.png
B列は削除する。
D13.png
やよい軒の時と同じ操作で空白セルを埋める
D14.png
D15.png
D16.png
D17.png
D18.png
D19.png
D19-2.png
空白セルが埋まった。
D20.png

CSVファイルに保存する。
D21.png

やよい軒の時と同じ操作でdelikaに取り込む。んん?文字化け?
E01.png

ここでファイルの種類の選択を間違えていた
D21.png
正しくはこちら
E01-2.png
こちらのCSV形式では正常に表示された
E03.png
クエリーを投げてみる
E04.png
んん?下から4行目から2行目の列がずれている・・・
E05.png
該当箇所を確認してみると、改行が入ってしまっているようだ。
E06.png

新しいシートに、改行を削除したものを作る。新しいシートのA1セルに以下のように入力し
E08.png
元のシートのA1セルを選択して
E09.png
Enterを押す。
E10.png
新しいシートの1行目全体にコピー
E12.png
2行目も同様。
E18.png
E19.png
E20.png
E21.png

最後の行まで行全体をコピーする
E23.png

最後の部分が元のものと一致しているか確認。
E22.png

新しいシートをCSV形式で保存する(今度はファイルの種類(エンコーディング)を間違えない、UTF-8を選ぶ)
E24.png

テキストエディタで開いて改行されていないことを確認。
F00.png

delikaに取り込んでクエリーを投げてみる。
F05.png
F06.png

今度は列がずれていない。すき家もdelikaへの取り込み、大成功!
F07.png

カロリーデータの取得とdelikaへの取り込み スシロー

カロリーはどこかにまとまって記載があるかな?
G01.png
「「スシローのメニュー」から商品ごとに確認することができます」の記載。
これは、もしや一つづつ取得するしかない?
がーーん。Excelで横着できないじゃないか・・。
G02.png

これ一個づつ取得するしかなさそう・・・。
H02.png

Scrapyを使ってみる。

スシローのメニューのWebページの構造を確認して、メニューの名称とカロリーの箇所のXPathを求める。
Chromeのその他ツールから「デベロッパーツール」を選ぶ
G03.png

右側に表示されているこのアイコンを押す。
G04.png
カロリーの箇所をクリックする。
G05.png

XPATHは //span[@class="price"][position()=last()]/text() で良さそう。
G06.png

タイトルの箇所をクリックする。
G07.png

G08.png

XPATHは //span[@class="ttl"]/text() で良さそう。
G09.png

Scrapyをインストールする。

$ pip install scrapy
$ scrapy version
Scrapy 2.7.1

プロジェクトを作成する。

$ scrapy startproject susiro
New Scrapy project 'susiro', using template directory '/Users/takaraya/opt/anaconda3/envs/scrapy_env/lib/python3.8/site-packages/scrapy/templates/project', created in:
    /Users/takaraya/pythonscrapy/susiro

You can start your first spider with:
    cd susiro
    scrapy genspider example example.com

$ cd susiro 
$ scrapy genspider susiro_menu www.akindo-sushiro.co.jp      
Created spider 'susiro_menu' using template 'basic' in module:
  susiro.spiders.susiro_menu

susiro_menu.pyを開く
スクリーンショット 2022-12-25 16.34.32.png

start_urlsをスシローのメニューのURLに修正する httpsに注意。
スクリーンショット 2022-12-25 16.36.40.png

def parseの中にさきほどchromeで調べてXPATHで、メニューとカロリーを取得するコードと、CSVで書き出すコードを追加する。
スクリーンショット 2022-12-25 17.25.54.png

susiro_menu.pyを拡大すると以下のような内容。

import scrapy


class SusiroMenuSpider(scrapy.Spider):
    name = 'susiro_menu'
    allowed_domains = ['www.akindo-sushiro.co.jp']
    start_urls = ['https://www.akindo-sushiro.co.jp/menu/']

    def parse(self, response):
        menu = response.xpath('//span[@class="ttl"]/text()').getall()
        cal = response.xpath('//span[@class="price"][position()=last()]/text()').getall()
        
        data = yield {
            'menu' : menu,
            'cal' : cal
        }
        
        for menu, cal in zip(menu, cal):
            print('"'+menu+'","'+cal+'"')

以下のコマンドでクロールを実行する。

$ scrapy crawl susiro_menu>susiro.csv

保存されたsusiro.csvを開いて、Webページと照合する。正しく抽出されているようだ。
スクリーンショット 2022-12-25 17.30.34.png
最後の部分も確認する。正しいようだ。
スクリーンショット 2022-12-25 17.32.13.png

CSVファイルを開いて1行目に列名menuとcalを追加してcsv形式で保存する。
スクリーンショット 2022-12-25 17.39.50.png

delikaに取り込む。スシローもうまく取り込めた。
スクリーンショット 2022-12-25 17.42.09.png

あー、おなかがすいた。

まとめ

カロリーの記載が、やよい軒はhtmlの表、すき家はPDFの表、スシローはWebページ内にバラバラに存在と、それぞれまちまちな形式でしたが、いずれも、簡便な方法で、うまくスクレイピングして、delikaに取り込むことができました。
最初は手間取りますが、慣れればそんなに時間はかからず、取り込めそうです。
これでメタボにならないメニュー選びもできるかも。
delikaは、非常に分かりやすく、取り込みが容易でした。

みなさんもさまざまな外食のチェーンのカロリーを取り込んでいただき、活用させてもらえるとありがたいなと感じました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1