
GASでスクレイピングを勉強し始めました。
データを取得するのに、できないサイト(?)でつまづいています。
※取得するのにライブラリで[Parser]を使用しています。
取得しようと思っているサイト
'nisa.morningstar.co.jp/fund_list.html
の順位やファンドなどのテーブル
やってみたこと
var morningstarURL0 = nisa.morningstar.co.jp/fund_list.html;
var morningstarHTML0 = UrlFetchApp.fetch(morningstarURL0).getContentText();
var morningstar0 = Parser.data(morningstarHTML0).from('<table data-table="index">').to('</table>').iterate();
var morningstar1 = Parser.data(morningstar0[0]).from('<tbody id="nisa_table_1">').to('</tbody>').iterate();
上記のコードだとmorningstar1 は<thead></thead>の間のデータしか取れませんでした。
ちなみに、スプレッドシート関数で
=IMPORTDATA("nisa.morningstar.co.jp/fund_list.html")
とやるとセル内に
<tbody id="nisa_table_1"></tbody>
となり、取得したいデータたちが表示しません。
そもそも取得できないサイトなのか、勉強不足でコードがよくないのか、他の方法で取得するのか、わからなくなってきました。
何が問題なのか、どうすればうまく取得できるのか、教えていただけたらと思います。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんにちは
回答がつかないみたいなので・・・
サーバにURL指定でリクエストした際に返される内容は、ブラウザの「ソースを表示」で表示される内容と基本的に同じです。
ご提示のページの「ソース」を見てみればわかると思いますが、テーブルの内容は項目タイトル部分は記載されていますが、tbodyにあたる部分は記載されていない状態です。
ご提示のコードではこれをもとに解析しているので、内容が取得できないということになっています。
一方で、実際のブラウザの表示では、上記のソースに当たるものを一旦表示してから、javascriptでサーバと通信をしてテーブルの内容に当たる部分を追加・表示するような仕組みになっています。
全体の表示形式は変わらないけれど、一部のデータだけいろいろ入れ替わる(ご質問のテーブル内)ような情報の場合に、変化するたびにページ全体のソースをメンテナンスするよりも、変化するデータだけ別に管理して、その部分だけメンテナンスする方式の方が便利なので、このような方式を取っているものと考えられます。
(似たような仕組みのサイトは数多くあります)
ですので、お求めの情報を取得するためにはソース内のスクリプトと同様の処理を行う必要があります。
多くのサイトでは外部からのこのような利用のためにAPIを公開している場合もありますが、ご提示のサイトの場合は「許可なく複製、転載、引用することを禁じます。」との記載がありますので、公開はしていないのではないかと思われます。(←ちゃんと探したわけではありませんので、推測です)
試しに、ソースに示されている内容でサーバにアクセスしてみると、テーブルの内容に当たるjsonデータが返されるので、この仕組みを利用すればデータの取得はできるものと考えられます。
とは言え、上記の理由から、必ずしも正しい方法とは言い難い可能性がありますので、これ以上の詳細な記述は避けておきます。
(上記の制限は「無断で」との条件がありますので、許可を得ればOKとも読み取れます)
サイト側が完全に防止しようとするなら、外部からの直接のアクセスは排除するといった方法も取れるので、そこまでは行っていないということでしょうか。
まぁ、そのような場合であっても、ブラウザを自動操作する方法をとることで情報を取得することは不可能ではありませんので、WEB公開情報である限りはそこまでは拘ってはいないってことかと思います。
回答になっているのかいないのかわかりませんが、ご参考までに。
回答になっています!
GASのスクレイピングでやってみればだいたいは可能、という浅知恵でした。
jsonデータのこと(はじめて知りました;)も勉強していきたいと思います。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAで、EXCELの入力規則...
-
Formatでmmが月と分を意味する理由
-
ActiveReportのDataSourceについて
-
テキスト表示位置を取得するには
-
ActiveWorkbook.Pathの一つ下の...
-
Java-jspの画面入力値保持について
-
JSPからJSPへ情報を渡せる?
-
フォーム上で押されたボタンに...
-
リクエストに応じたselectedの...
-
jspからServletを呼び、元のjsp...
-
「<c:forEach タグが終了し...
-
webアプリを作ってます。エラー...
-
JSPでのリストボックス表示
-
グローバルIPアドレスの変更タ...
-
ServletからServletへの値渡し
-
C言語で今まで表示していた画面...
-
ラジオボタンの選択肢をサーブ...
-
java初心者です。 画面Aで情報...
-
腕時計の時報をならないように...
-
三菱GOTの画面切り替えについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
登録済みイベントリスナーの情...
-
Formatでmmが月と分を意味する理由
-
ActiveWorkbook.Pathの一つ下の...
-
EXCEL VBAで、EXCELの入力規則...
-
VBAでTIFF画像を読み込むには?
-
jsp 動的テーブルについて
-
エクセルVBAでホームページの文...
-
MultipartRequestWrapperについて
-
ibatis queryForList取得できない
-
ActiveReportのDataSourceについて
-
GoogleMapでの複数マーカー表示...
-
ミキサーの操作
-
[JavaScript] 正規表現による複...
-
java → jsp コンボボックス表示...
-
指定地点(緯度・経度)から指定...
-
テキスト表示位置を取得するには
-
strutsで空白を認識させるには?
-
ADO.NETの処理分岐について教え...
-
javaを使い、jsonデータを取得...
-
javascriptでローカルフォルダ...
おすすめ情報