PR

Step1 銘柄一覧をDBに登録(phpQueryを使ってスクレイピング)

銘柄一覧をDBに登録 PHP

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

それでは、次に進みましょう。

Step2 過去の株価をDBに登録

タイトルとURLをコピーしました