
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript gasについて 1 2022/05/31 21:51
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
登録済みイベントリスナーの情...
-
javascriptでローカルフォルダ...
-
Formatでmmが月と分を意味する理由
-
EXCEL VBAで、EXCELの入力規則...
-
jspからServletを呼び、元のjsp...
-
リクエストに応じたselectedの...
-
「<c:forEach タグが終了し...
-
フォーム上で押されたボタンに...
-
Java-jspの画面入力値保持について
-
三菱GOTの画面切り替えについて
-
Javaプログラミングの質問にな...
-
VB6 開発環境のエディタに行...
-
Mapの要素の削除と挿入
-
JSPからJSPへ情報を渡せる?
-
jspでbeanを使いたいのです...
-
エラーページ遷移後に入力値を残す
-
IIS+VBScriptでの処理待ちについて
-
フレーム分けされたJSPでのsubmit
-
ASP.NET 画面遷移前の状態を保...
-
ブラウザ画面で、変更した値が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
登録済みイベントリスナーの情...
-
EXCEL VBAで、EXCELの入力規則...
-
VBAでTIFF画像を読み込むには?
-
ActiveWorkbook.Pathの一つ下の...
-
Formatでmmが月と分を意味する理由
-
Excelで可視セルの行番号取得
-
自分のファイル名取得
-
ActiveReportのDataSourceについて
-
vbaで、オートシェイプ文字列、...
-
DOSコマンドの時間取得について
-
VBScriptで「My Documents」フ...
-
スプレッドのアクティブセルの...
-
ページ制御
-
javascriptでIMEの状態を取得
-
エクセルVBAでホームページの文...
-
指定地点(緯度・経度)から指定...
-
携帯電話のGPS機能って。
-
strutsで空白を認識させるには?
-
submitで送られた内容をすべて...
-
jsp 動的テーブルについて
おすすめ情報