paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

HTMLスクレイピングで旬の食材を確認する

元々自炊するタチなのですが、昨今の状況でリモートワークもあり料理の機会が増えています。

今は年中食材が手に入りますが、どうせなら旬のものを食べたいですよね。
あらゆるWebサイトで旬の食材を確認できますが、毎回アクセスするのも面倒です。

幸い私はITの業界で働いていますのでスクレイピングでサクッと抽出したいと思います。

スーパーに行けば旬のコーナーがあるという問題は置いておきますw

環境

メインPCのWSLで行います。

masashi@DESKTOP-986MNSO:~$ uname -a ; lsb_release -a
Linux DESKTOP-986MNSO 4.4.0-18362-Microsoft #1049-Microsoft Thu Aug 14 12:01:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:        16.04
Codename:       xenial

リソースの取得

旬の食材は更新されるものではないので、都度アクセスする必要はありません。
なのでローカルにリソースを持っておきます。

今回はこちらのサイトを参考にさせていただきました。

旬の食材カレンダー

月ごとに一覧化されているページがあるのでそちらを頂きます。

wget https://k52.org/syokuzai/all/1
…
wget https://k52.org/syokuzai/all/12

ファイル名は特に変更しないので1から12までのファイルが手に入ります。
ちゃんとHTMLファイルですよ。

masashi@DESKTOP-986MNSO:~$ file {1..12}
1:  HTML document, UTF-8 Unicode text, with very long lines
2:  HTML document, UTF-8 Unicode text, with very long lines
3:  HTML document, UTF-8 Unicode text, with very long lines
4:  HTML document, UTF-8 Unicode text, with very long lines
5:  HTML document, UTF-8 Unicode text, with very long lines
6:  HTML document, UTF-8 Unicode text, with very long lines
7:  HTML document, UTF-8 Unicode text, with very long lines
8:  HTML document, UTF-8 Unicode text, with very long lines
9:  HTML document, UTF-8 Unicode text, with very long lines
10: HTML document, UTF-8 Unicode text, with very long lines
11: HTML document, UTF-8 Unicode text, with very long lines
12: HTML document, UTF-8 Unicode text, with very long lines

構成確認

サンプル的に1月のHTMLファイルの構成を確認します。

<td class="name"><a href="/syokuzai/013">カリフラワー</a></td>
<td class="othername"><a href="/syokuzai/013">cauliflower</a></td>

nameかothernameのクラス名でひっかけられそうですね。
othernameクラスだと英語が混じっているので、ぱっとわかるようにnameクラスの方を使いましょう。
また、ページは食材の種類別に分けられていますが、スクレイピングでは取るだけで分けないことにします。

shellでやる

pythonのBeautifulSoupは使えるのですが、この単発の思い付きにわざわざコード書くのも何なのでshellからやります。

masashi@DESKTOP-986MNSO:~$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

xmllintで抽出

HTMLタグをgrepで何とかしようとすると難しいので簡単にできるようxmllintを使います。

クラス名でひっかければOKですね。

masashi@DESKTOP-986MNSO:~$ xmllint --xpath '//td[@class="name"]/a/text()' --html 1
カリフラワーキャベツきょうな(みずな)くわいごぼうこまつなしゅんぎくせりセロリだいこんながいも(やまいも)ながねぎなのはなのざわなはくさいブロッコリーほうれんそうめキャベツゆりねれんこんいよかんオレンジキウイシークワーサーみかんレモンあんこういなだ・はまちきんき(きちじ)きんめだいこはだ(このしろ)さわらたらひらめふぐぶりほうぼうぼらわかさぎあかがいあまえびイイダコヤリイカいせえびかきずわいがにタラバガニけがにしじみたらこのりほたてあずきあんこおからこんにゃく・しらたきとうふなっとう

あら、全部くっついて出てしまいましたね。
text()で出力すると改行ができないようです。

じゃあaタグまでにする?

masashi@DESKTOP-986MNSO:/mnt/c/Users/tsuru$ xmllint --xpath '//td[@class="name"]' --html 1 | sed 's/<\/a>/<\/a>\n/g'
<td class="name">食材名</td><td class="name"><a href="/syokuzai/013">カリフラワー</a>
</td><td class="name"><a href="/syokuzai/015">キャベツ</a>
</td><td class="name"><a href="/syokuzai/017">きょうな(みずな)</a>

sedは使ったものの、一行ごとに並びました。
が、ここからタグの中身を出力するなら初めからgrepで取っても手間は同じですね。

grepでやり直します。

grepスクレイピング

<td class="name"><a href="/syokuzai/013">カリフラワー</a>

このHTMLの「カリフラワー」の部分だけを抜きます。

早速ですが、コマンドはこちらです。

masashi@DESKTOP-986MNSO:~$ grep -oP "<td class=\"name\"><a[^>]*?>\K.*(?=</a>)" 1 | head -1
カリフラワー
  • 簡単な解説
    • -oで対象の文字列のみを出力。
    • -Pでperl正規表現が使えます。(下記の\Kのため)
    • \Kで\Kより左側がgrepの対象になるようです。(-o付きなので出力の対象外になる)

なのでnameクラスのタグ内で、aタグで閉じられる文字列が抽出の対象という事になります。

11月の旬を確認

ここまで出来たらもう完成ですね。
本日は10月最終日なので来月の旬の食材を確認しましょう。

1行ずつだと長いので記事用にcolumnで整形します。
スマホからだと見にくかったので1列に直しました。

masashi@DESKTOP-986MNSO:~$ grep -oP "<td class=\"name\"><a[^>]*?>\K.*(?=</a>)" 11 
えのき
エリンギ
かぶ
かぼちゃ
カリフラワー
ぎんなん
くわい
ごぼう
さつまいも
さといも
さんしょう
しいたけ
じゃがいも
しゅんぎく
だいこん
ちんげんさい
ながいも(やまいも)
ながねぎ
なめこ
にんじん
のざわな
はくさい
ブロッコリー
ほうれんそう
マッシュルーム
むかご
ゆりね
ルッコラ
レタス
れんこん
かき
かりん
キウイ
みかん
ゆず
りんご
いなだ・はまち
うなぎ
かます
きんき(きちじ)
こはだ(このしろ)
さけ
さば
さわら
ししゃも
たちうお
にしん
はたはた
はも
ひらめ
ふぐ
ぼら
いくら
いせえび
タラバガニ
けがに
たらこ
のり
あずき
あんこ
こんにゃく・しらたき
そば
ピーナッツ

OK!
対象にしたタグの都合上ひらがなで出てしまいますが、まあいいでしょう。

11月はまだ秋と言っていいんでしょうか?食欲の秋でいい食材が揃いますね。
来月はこの出力内容をスマホに入れてスーパーに行きましょう。

むすび

という訳で今回はshellからのスクレイピングでした。
今はインターネット上に膨大なデータがありますから、この技を身につけておけばいろんな資料が作れますね。

これでshellを使ったちょっとしたスクレイピングができるようになりました!

参考サイト

プリキュアで学ぶワンライナーWebスクレイピング - Qiita

XPath Cheat Sheet

基本的な正規表現一覧 | murashun.jp