Geek
         2014年に「クローラー/スクレイピング Advent Calendar 2014」というものがQiita上であったらしい。
その中で興味がわいた、
シェルスクリプトを使って「これから毎日金相場をスクレイピングしようぜ?」
を試してみたところ、現状では利用できなくなっていたので、
少し手を加えて、2016年現在の形式に変換した方法。

2014年以降、田中貴金属のWebページがリニューアルしたのではないだろうか。

実際、上記のページでは、貴金属価格の表は、以下の状態だが、

シェルスクリプトを使って「これから毎日金相場をスクレイピングしようぜ?」という話

現在は、以下の様に、表の形式が全く異なっている。

貴金属価格 2016年4月13日現在

スクレイピングするために、一部手を加える必要がある。

※スクレイピングは情報収集のための手法です。
悪用等して過度な負荷をサイトにかけない様にしましょう。
 
 
なるべく形式を参考にさせていただいた
シェルスクリプトを使って「これから毎日金相場をスクレイピングしようぜ?」
に合わせて記載すると、

スクレイピングの手順


現在の田中貴金属の貴金属価格ページは以下の様になっているので、

<table id="metal_price">
<tbody><tr>

<th class="metal_name"> </th>
<th class="retail_tax">税込小売価格</th>
<th class="retail_ratio">(小売価格前日比)</th>
<th class="purchase_tax">税込買取価格</th>
<th class="purchase_ratio">(買取価格前日比)</th>
<th class="price_trends"> </th>
</tr>
<tr class="gold">
<td class="metal_name">金</td>
<td class="retail_tax">4,777 円</td>
<td class="retail_ratio">+9 円</td>
<td class="purchase_tax">4,692 円</td>
<td class="purchase_ratio">+10 円</td>
<td class="price_trends"><a href="d-gold.php">価格推移</a></td>
</tr>
<tr class="pt">
<td class="price_trends"><a href="d-silver.php">価格推移</a></td>
.
.
.
.
(略)
</tr>
</tbody></table>


スクレイピング用のシェルスクリプトは以下の様にすることができます。

#!/bin/sh

# Tanaka 貴金属のURL
URL='http://gold.tanaka.co.jp/commodity/souba/index.php'

TMP_DIR=<作業用PATH>
DOC=${TMP_DIR}/index.php

[ ! -d ${TMP_DIR} ] && mkdir ${TMP_DIR}

wget --quiet -O ${DOC} ${URL} || exit 1

echo -n `date "+%C%y/%m/%d,"`

#ここからQiitaと異なる。
/usr/local/bin/nkf -w ${DOC}| \
egrep '(metal_name">金|metal_name">プラチナ)' -A 6| \
grep ' grep -v '\+'| \
egrep '(retail_tax|purchase_tax)'| \
sed -e 's///g' -e 's%%%g'| \
sed -e 's///g' -e 's%%%g'| \
sed -e 's/円//g' -e 's/,//g'| \
awk '{print $1}'| \
paste -d , - - - -


Wgetまでの処理は同じです。ですので解説は割愛します。
コードの解説としては、変わっている部分ですが、
Qiitaに合わせて行うと、スクリプトは16行目から

html上では、

<tr class="gold">
<td class="metal_name">金</td>
<td class="retail_tax">4,777 円</td>


と形式が変わっています。
例として、金とプラチナを取得するために、

egrep '(metal_name">金|metal_name">プラチナ)' -A 6| \


を利用していますが、

egrep '(|)' -A 7| \


でも構わないかと思います。
ただのgoldやptという表記では同じページの別のclassなどに引っかかる可能性もあるので、
tr class をまとめて取得するのが良いでしょう。

egrepはgrepに正規表現を用いた上位互換の様なものです。

そのあとはほとんど一緒ですね。
HTMLの形式が変わったことで、sedを利用した不要なデータを除去しています。

最終的に実行すると以下の様な形で出力されます。
形式は、Qiitaの形式に合わせています。
そのため、
2016/04/13,4777,4692,3871,3743


という出力結果となります。 

スポンサーサイト

関連キーワード(ユーザータグ):
scraping
スクレイピング
シェルスクリプト

貴金属価格

トラックバック用URL ;http://gatolynx.blog100.fc2.com/tb.php/326-2c2a1083

コメントの投稿

非公開コメント