1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kitcometalsから値段を持ってくる

1
Last updated at Posted at 2013-03-08

先に書いておくけど、私の本職はプログラマでも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/

hoge.php
<?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要素で回し、現在の価格を取得することに成功。

hage.php
<?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は型自動認識なのがこういう時には無駄に役立つようなどうでもいいような。
と言うか後々のエラーの温床になる気がするので、クローズ時間に現在値だけ持ってくるのが正解かな。
ともあれ、なんとか目的は果たしましたとさ。

……こんなメモでも残していいのかしら。テスト投稿も兼ねて。

1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?