今回は取得したデータをデータベース(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の構造を解析するのは少し難しいかもしれませんが、
そんなにハマってしまう箇所はなさそうですね。
それでは、次に進みましょう。