質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

PHP・MySQLによるDBへのHTMLデータの格納

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,515

kenya.yasuhara

score 17

ウェブページ (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

私初学者であるため、なるべく単純な方法で解説いただけますと大変助かります。

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

技術的には、何らかのプログラム言語でスクレイピング(使いたい言語やOS+スクレイピングで検索するとサンプルなどが見つかります)を行い、実行結果をその言語からDBにアクセスして保存します。

ただ、YAHOOファイナンスの場合、
Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています

と言う事なので、
「利用規約的に実行してはいけない」
「無視して実行した場合、アクセスブロックや法的措置などがとられる可能性がある」
となってしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 22:31

    ご回答いただきありがとうございます。
    恥ずかしながらスクレイピングというのは初めて聞きました。それ以外にHTMLデータをDBへ格納する方法はないのでしょうか。

    キャンセル

  • 2017/08/26 23:12

    HTMLを自動で取得、解析して保存する(+法則に基づいて自動アクセスを繰り返す)という手法そのものがスクレイピングと呼ばれるので、
    「それ以外」となると、「基本的には存在しない」という回答になってしまいます。
    (YAHOOファイナンスの場合、データ自体を売り物にしているので、仮にデータ取得部分を人力で行ったとしても数が多ければアウトと判定され可能性があると思います。)

    テスト的に手動で少数のダウンロードしたHTMLを解析して、証券コードをキーにして検索できる仕組みを作る
    と言う事であれば利用規約にも抵触しないはずなので(と私は思います)、
    一度スクレイピングの手法を学んでみて、データの取得部分を手動に置き換えるというアプローチがいいかなと思います

    キャンセル

0

 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ソース中の必要な情報を抜き出して保存・再利用します。このような手法はスクレイピングと呼ばれています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る