金属材料の素材単価を取得する

ちょっと本業に役立つことをやってみます。コストトレンドを押さえるためにWebから価格情報を引っ張ってきます。

本業でもシェルスクリプトを使いたい

残念ながら会社のPCはWindowsマシンなのでシェルスクリプトを使うことができません。

でも使いたい!ので作りました!(笑

というわけでWebからデータを集めてくるScraperです。ネタは金属材料の素材単価ですが、購買じゃないのでそんなに細かい値段は知らなくていいです。だいたいの相場を押さえるために作りました。

GitHubに金属材料の素材単価を取ってくるスクリプトを置いてあります。

データの出どころ

これを定めないことにはデータフォーマットがわからないのでスクリプトの組みようがありません。業務上めっき鋼板の素材単価は押さえておきたいので、日刊鉄鋼新聞のサイトを覗いてみました。

日刊鉄鋼新聞

  • 冷延ステンレス鋼板(SUS304)
  • 溶融亜鉛めっき鋼板(SGC)
  • 電気亜鉛めっき鋼板(SEC)
  • 銅小板(C1100)
  • アルミ合金板(A5052P)
  • アルミ合金形(A6063)

ま、このくらいあればいいか。

curlで落とす

いろんな地域の高値安値がずらりと並んでいますが、とりあえず東京の高値でいいや。一番最初に出てくる数値だから判定が簡単だし。ただしこのサイト、文字コードがEUC-JPなのでutf-8に変換する必要があります。

curl http://www.japanmetaldaily.com/market/details/index.php | nkf -w8 > metal.txt

落としたデータのステンレスの部分を抜き出してみました。テーブルに材料名称と価格が入っています。セル毎に改行されているのは楽かもしんない。

<tr>
  <!--<th rowspan="2" class="rateLeftCell">条鋼(建材)<br />製品</th>-->
  <th rowspan="2" class="rateLeftCell">特殊鋼</th>
  <td class="itemCell">冷延ステンレス鋼板<br />
(SUS304,18-8,2〜3ミリ)</td>
  <td colspan="2">310,000</td>
  <td colspan="2">310,000</td>
  <td colspan="2">320,000</td>
  <td colspan="2">&nbsp</td>
  <td colspan="2">&nbsp</td>
  <td colspan="2">&nbsp</td>
  <td colspan="2">&nbsp</td>
</tr>

grepの-Aオプション

データ抽出といえばgrep。行単位でキーワードを引っ掛けて抜き出してくれるのだけれど、今回はキーワードと実際に使いたいデータのある行が異なる。そんなとき頼りになるのが“-A”オプション。オプションに続けて数字を指定すると、キーワードを含む行に加えて指定行数分抽出してくれる。他にも”-B”と”-C”が似たような機能を持っています。

オプション 内容
-A After context。grepで抽出した行に加えて、後ろの行を指定行数分表示する。
-B Before context。grepで抽出した行に加えて、前の行を指定行数分表示する。
-C Context。grepで抽出した行に加えて、前後の行を指定行数分表示する。

なので上のステンレスの場合は次のようになります。

$ grep -e "冷延ステンレス鋼板" -A 2 metal.txt
    <td class="itemCell">冷延ステンレス鋼板<br />
(SUS304,18-8,2〜3ミリ)</td>
    <td colspan="2">310,000</td>

trでぶつ切りに!

うまく抽出できたら必要なのは最終行だけなのでtailで取り出した後、価格を切り出します。欲しい値がタグで囲まれているのでtrを使って”<“と”>”を改行に置換します。普通の置換であればsedを使うところですが、sedは改行の扱いが得意ではないためtrを使います。加えて鉄はキロ単価なのにステンレスはトン単価なので、単位を合わせるために”,”も改行に置換します。

$ grep -e "冷延ステンレス鋼板" -A 2 metal.txt | tail -1 | tr "\<\>\," "\n"
    
td colspan="2"
310
000
/td

後は必要な数字を抜き出して体裁を整えれば出来上がり。Raspberry Piでもちゃんと動くよ!

100 23712    0 23712    0     0  21674      0 --:--:--  0:00:01 --:--:-- 21694
20160402(Sat)21:09
SUS304 310
SGCC   155
SECC    88
C1100  870
A5052P 695
A6063  600