先に書いておくけど、私の本職はプログラマでもSEでもありません。
解法がスマートじゃないのはきっとそのせいです。そういうことにしておきます。
あと有用かどうかは知りません。誰かの役に立つと言いかもしれないけど。
http://www.kitcometals.com/
金属の変動を書いているサイトがあるのですが、上司から「このサイトに書いてある価格の推移を数値にして、定期的に送ってね」と言われたので、入社からコレまで手打ちで頑張ってきたのですが、いい加減自動化してサボろうと思いたったので頭を悩ませながら手法を模索。
ちなみに価格は銅だとすると
http://www.kitcometals.com/charts/copper_historical_large.html#30days
のグラフ内にその日の終値の数値があるものの、テキストベースで落ちている場所はなく。
結果的にトップページの左側においてある数字を引っ張って、変動価格差を反映させれば値が取れるということで、
1:ページそのものを引っ張ってくる
2:中身をスクレイピングして欲しい数字を算出する
3:日付を添えてデータベースにぶち込む
という方法を使えばいいんじゃないかなという結論になりまして。
この記事では2までのメモ。
前置きが長くなったけど、とりあえずやってみようとソースコードを見て驚愕。
対策なのか単にレガシーすぎるだけなのか。tableを死ぬほど入れ子にしてサイトができているのでした。
せめて場所ごとにCSS使えよ!
愚痴っても始まらないので、とりあえずウェブを持ってくる。
色々調べた結果、phpQueryを使うことにする。記述時点では0.9.5。
http://code.google.com/p/phpquery/
<?php
require_once('phpQuery/phpQuery.php');
$html = phpQuery::newDocumentFile('http://www.kitcometals.com/');
mb_language('Japanese');
$i=0;
$lists = $html['table'];
foreach ($lists as $list) {
echo "でぃすてーぶるいず eq".$i;
echo pq($list)->htmlOuter();
echo "<br />";
$i++;
}
動かすと実に79個のテーブルが発生しやがりました。同じ文字が数回並んだりして見てられない……
銅のテーブルはどうやらeq15みたいなので、決め打ちで取ってくることに。
入れ子にできるみたいなので更にtr要素で回し、現在の価格を取得することに成功。
<?php
require_once('phpQuery/phpQuery.php');
$html = phpQuery::newDocumentFile('http://www.kitcometals.com/');
mb_language('Japanese');
$lists = $html['table:eq(15)']; //テーブル決め打ち
$hoge = $lists['tr:first td:eq(1)'];
$coppercurrent = pq($hoge)->text();
$hoge = $lists['tr:eq(1) td:eq(1)'];
$change = pq($hoge)->text();
//echo $coppercurrent -$change;
phpは型自動認識なのがこういう時には無駄に役立つようなどうでもいいような。
と言うか後々のエラーの温床になる気がするので、クローズ時間に現在値だけ持ってくるのが正解かな。
ともあれ、なんとか目的は果たしましたとさ。
……こんなメモでも残していいのかしら。テスト投稿も兼ねて。