今回は取得したデータをデータベース(MySQL)に登録するのでデータベースの準備をしておきます。
データベース作成
CREATE DATABASE db_stock DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
銘柄マスタテーブルの作成
まずは銘柄を登録するテーブルを作成しておきます。
CREATE TABLE IF NOT EXISTS `stock_m_name_tbl` ( `stock_code` varchar(10) NOT NULL COMMENT '銘柄コード', `stock_name` varchar(128) NOT NULL COMMENT '銘柄名称', `stock_market` varchar(128) NOT NULL COMMENT '市場', `del_flag` int(1) DEFAULT '0' COMMENT '削除フラグ', `up_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日時' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='銘柄マスタ';
プライマリーキーの設定
ALTER TABLE `stock_m_name_tbl` ADD PRIMARY KEY (`stock_code`);
HTMLを解析
銘柄マスタを登録していくためのHTML構造を調べます。
銘柄の一覧にはすべての銘柄が表示されていないため、
銘柄一覧が何ページあるのかを調べ一覧ページすべてを巡回して登録していく必要があることが分かります。
ページ数を取得するには下記のように記述します。
HTML内の取得したいタグまでのXPATHを取得するにはChromeを使いF12で開発ツールを開いて、
Elementsから取得したい部分を右クリックし「Copy」→「Copy XPath」で取得することができます。
// HTML読込
$html = phpQuery::newDocumentFile('https://kabuoji3.com/stock/?page=1');
// ページリストを取得
$page = $html['#base_box > div > ul > li'];
// ページリスト数をカウント
$page = count($page);
1ページから銘柄一覧部分を取得するXPathは下記のような複雑なものになります。
// 銘柄部分を取得 $trs = $html['#base_box > div > div.data_contents > div > div > div > table > tbody > tr'];
さらに子要素を取得する場合はpq()を使いJQueryのように取得したい要素を取得することができます。
$stock = pq($tr)->find('td:nth-child(1)')->text();
銘柄マスタを登録
銘柄マスタを登録するソースは下記のようになります。
<?php
// phpQueryの読み込み
require_once("./phpQuery/phpQuery.php");
// DBアクセス用オブジェクト作成
$mysqli = new mysqli('サーバ', 'ID', 'パスワード', 'db_stock');
if ($mysqli->connect_error) {
echo $mysqli->connect_error;
die('接続失敗です。'.mysql_error());
} else {
$mysqli->set_charset("utf8");
}
// 銘柄名の一覧ページ数を取得
$html = phpQuery::newDocumentFile('https://kabuoji3.com/stock/?page=1');
$page = $html['#base_box > div > ul > li'];
$page = count($page);
// 銘柄一覧ページ数ループ
for ($ipage = 1; $ipage <= $page; $ipage++) {
// 銘柄一覧1ページ分を登録
stockRegist('https://kabuoji3.com/stock/?page=' . $ipage);
}
/**
* 銘柄一覧登録
* @param $url 株価一覧ページURL
*/
function stockRegist($url) {
global $mysqli;
// 取得したwebサイトを読み込む
$html = phpQuery::newDocumentFile($url);
// 銘柄部分を取得
$trs = $html['#base_box > div > div.data_contents > div > div > div > table > tbody > tr'];
// 取得した銘柄数分ループ
foreach(pq($trs) as $tr) {
$stock = pq($tr)->find('td:nth-child(1)')->text();
// 銘柄コード
$stock_code = substr($stock, 0, strpos($stock, ' '));
// 銘柄名
$stock_name = substr($stock, strpos($stock, ' '));
// 市場
$stock_market = pq($tr)->find('td:nth-child(2)')->text();
// 登録用SQL作成
$sql = "INSERT INTO stock_m_name_tbl (stock_code, stock_name, stock_market) VALUES (";
$sql = $sql . $stock_code . ", '" . $stock_name . "', '" . $stock_market . "') ";
$sql = $sql . "ON DUPLICATE KEY UPDATE stock_code = '" . $stock_code . "', stock_name = '" . $stock_name . "', stock_market='" . $stock_market . "'";
// DBへ登録
$mysqli->query($sql);
}
}
$mysqli->close();
?>
HTMLの構造を解析するのは少し難しいかもしれませんが、
そんなにハマってしまう箇所はなさそうですね。
それでは、次に進みましょう。

