質問: ウェブページ (Yahooファイナンス)から、証券コードを引数にして任意の株価ページをダウンロードしてDBに格納しようとしています。 **<質問>** この場合MySQLだけで済むのか、それともPHPも書かなければいけないのか、またどちらの場合もどのような処理をすればそれが実行できるのでしょうか。 **<できていること>** * MySQLでDB、テーブルおよびカラムを作成 * yahooファイナンスの任意の株価ページ (https://stocks.finance.yahoo.co.jp/stocks/detail/?code=2678.T)をHTMLファイル(cssや画像などは不要)として手動でダウンロード **<できていないこと>** * 証券コード (上記の株価ページの場合'2678')を引数として、上記株価ページをダウンロードしDBに格納するコードを書く カラムは page// htmlファイルを格納 のみです。 <環境> * Mac * テキストエディタ: atom 私初学者であるため、なるべく単純な方法で解説いただけますと大変助かります。 よろしくお願い致します。
回答: ##### MySQLのみの場合 ローカルにhtmlファイルがあるのであれば、MySQLのLOAD_FILE関数でファイル内容を読み込むことができますが、パーミッション等の問題があるのであまりおすすめしません。またHTTPクライアントではないため、URLの一部を動的に変更して取得しデータベースに格納するような目的では使用できません。 ``` INSERT INTO `mytable` VALUES('page', LOAD_FILE('/Users/Documents/bar.html')) ``` ##### MySQL+PHP 最も一般的な方法です。file_get_contents関数はURLからhtmlソースを取得し、文字列として返します。以下の例では、URLの一部を動的にしてhtmlソースを取得しています。あとはPDO等を使ってMySQLデータベースにinsertするコードを書くだけです。 ``` function get_html($stock) { $url = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code={$stock}.T"; $html = file_get_contents(url); return $html; } $stock_id = "2678"; $source = get_html($stock_id); // PDOの初期化は省略 $stmt = $pdo->prepare("INSERT INTO `mytable` VALUES(:page, :html)"); $stmt->bindValue(":page", $stock_id); $stmt->bindValue(":html", $source); $stmt->execute(); ``` 多くのケースではhtmlソース全体を保存するのではなく、htmlソース中の必要な情報を抜き出して保存・再利用します。このような手法はスクレイピングと呼ばれています。