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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2517閲覧

【javascript】1秒毎にページ確認、表示されたらスクレイピング&作業を終了

tajix_japan

総合スコア132

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/01/03 04:53

あるホームページをスクレイピングします。
データの表示に時間がかかるページのため、下記のように1秒ごとにページを確認、表示されたらスクレイピングし、すぐに作業を終了します。
(ちなみにhttp://example.comは自社サイトです)

下記のように作りました。

  1. window open と同時に1秒ごとにurl20を確認し、
  2. 表示されたらスクレイピング。
  3. 表示が完了したら if(content20 != null)
  4. この作業を終了します。clearInterval(intervalID);

javascript

1 2<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 3 4<script type="text/javascript" src="./../js/jquery.xdomainajax.js"></script> 5 6 7 <script> 8url20 = 'http://example.com/moto.php' 9 function loop(){ 10 $.get(url20, function(data20){ 11 var content20 = $(data20.responseText).find('.dropdown').html(); 12 $("#text20").html((content20), 13 function(data1) { 14 if(content20 != null) 15 clearInterval(intervalID); 16 }); 17 }); 18 } 19 intervalID = window.setInterval(loop,1000); 20</script> 21 22 <div id="text20"></div> 23

うまく動きません。

どこに誤りがあるかご教示戴けますでしょうか?

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なんとなくですが、アプローチ方法が間違ってる気がします。

http://example.com/moto.phpが動的に変化するサイトでそれをリアルタイムで表現したいとかそういったことがやりたいのではないでしょうか?

もしそうなのであれば、http://example.com/側でAPIを用意し、JSON等で表示したいデータを返す仕様に変更したほうが現実的です。

それとも負荷テストか何かなんですかねぇ?

投稿2017/01/03 10:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tajix_japan

2017/01/03 11:00

有難うございます。APIですか? 目から鱗です。 その発想は全くありませんでした。今まで単に利用するだけの側でしたので。 API作成の方向も併せて検討したいと思います。 初めての経験になりますので作れるかどうかわかりませんが、一生の財産になるかと思います。 有難うございました。
退会済みユーザー

退会済みユーザー

2017/01/03 11:06

リアルタイムに表示するなら、JavaScriptで実装するチャットを参考にすると良いですよ。 どのようなことがやりたいのかが明確になれば、もう少し具体的なアドバイスが貰えると思います。 がんばってください。
tajix_japan

2017/01/03 11:15

有難うございます。 チャットのjavascript探してみます。
guest

0

jQuery.html() にコールバックファンクションは設定できません。

【.html() | jQuery API Documentation】
http://api.jquery.com/html/

投稿2017/01/03 04:58

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tajix_japan

2017/01/03 05:09

有難うございます。 .txt にしてみたのですが、それでもやはり動きません。 上手い方法がございましたらご教示戴けましたら幸いです。 よろしくお願いいたします。
kei344

2017/01/03 05:19 編集

少なくとも.text() ですが、同じくコールバックを採りません。 【.text() | jQuery API Documentation】 http://api.jquery.com/text/ 表示の完了を待つイベントというものは特に無かったと思います。HTMLの中に画像が入っている場合はそのロードイベントを拾うことができるかもしれませんが。 書かれている内容的に「 $.get(url20, function(data20){/*ここ*/});」のコールバック(「ここ」の部分)で clearInterval すればよいのでは? また、1秒以内にレスポンスが返らない場合はそのコールバックが2回以上発生する事も考慮に入れたほうが良いと思います。
tajix_japan

2017/01/03 08:19

有難うございます。 下記のようにしてみましたが動きません。 ただ、軽いページなら普通に表示されますので、重いページでのloopが回っていないようです。 ご指導いただきました件について私の解釈に誤りがあればご指摘頂けましたら幸いです。 <script> url20 = 'http://example.com/moto.php' function loop(){ $.get(url20, function(data20){ var content20 = $(data20.responseText).find('.dropdown').html(); $("#text20").html(content20); }); if(content20 != null) clearInterval(intervalID); } intervalID = window.setInterval(loop,1000); </script> >HTMLの中に画像が入っている場合はそのロードイベントを拾うことができるかもしれませんが。 スクレイピング先は自社サイトのため、http://example.com/moto.php' にgazou.gif という画像を新たに埋め込むことは可能です。ただ確認してみたところ、画像を配置しても .htmlでは画像の表示には至らないようです。もし私の勘違いであればご指導いただけましたら幸いです。 よろしくお願いいたします。
kei344

2017/01/03 08:29

「動きません」とはどのような状況でしょうか。console.log などデベロッパーツールでどこまでが問題なのか確認されてみてはいかがでしょうか。 【Chrome デベロッパーツールの使い方概要 | Web Tips】 [http://weback.net/utility/1410/ また、外部からロードしてロードを待つなら iframe で良いのでは。 【jQuery iframeの読み込み完了後のタイミングで処理を実行する方法 | Stronghold Archive】 https://zxcvbnmnbvcxz.com/jquery-iframe-loaded/
tajix_japan

2017/01/03 09:49

教えていただきありがとうございます。下記のテストを行いました。 【test1】 if(content != null) clearInterval(intervalID); 指示頂いた上記の位置 【test2】 if(content20 != null) return; 【test3】 if(content != null) clearInterval(intervalID); もともとの位置 いずれも、最初の読み込みではcallbackを得ることができていませんが、2回目を読み込ませると、callbackできるようです。 最初の読み込み時にcallbackが取れないということは、読み込み時点で複数回loopができていないのだと思います。 $.ajaxでやっても、.htmlや.txtを取る限り同じ現象ですよね。 今回は自社サイトのスマホ対応を考えているため、どうしても通信速度によって、タイムラグが出てしまいます。複数回の読み込みをしないとすべてのユーザーに情報を与えることができません。スマホアプリでサーバーの情報を読み込むものは無数にあるためやり方がありそうなのですが。 インラインフレームについて 今回やろうとしていることは自社ページのスマホアプリ対応です。スマホ側にインラインフレームを置くと、子ページをスクロールした時に、親ページも同時にすくクロールされることになります。子ページでトップに戻るボタンを押しても親ページのトップに戻れないなど複数の許容できない事象が起こるため、スクレイピングで解決したいと思っています。 このたびは何度もご指導いただき有難うございました。お時間をお取りいただき感謝いたします。
kei344

2017/01/03 10:06

> このたびは何度もご指導いただき有難うございました。 なんらか解決されたようですね。 蛇足ですが、下記問題を見つけました。 url20 = 'http://example.com/moto.php' function loop(){ $.get(url20, function(data20){ var content20 = $(data20.responseText).find('.dropdown').html(); $("#text20").html(content20); }); if(content20 != null) clearInterval(intervalID); } }//←とりあえず1こ足りない intervalID = window.setInterval(loop,1000); インラインフレームについて インラインを読み込んだ上でa要素をtargetを指定すれば解決出来ますよ。またスクロールもイベントを処理すれば出来ます。
tajix_japan

2017/01/03 10:32

有難うございます。 まだ解決はしていませんが、あまりに時間を取らせてしまい申し訳なくなってしまいました。 GETしたら解除という発想をやめ、規定回数連打という方向で考えたいと思います。 インラインフレームについてはやり方があるとは思っていませんでした。 もし、スクレイピングを諦めインラインフレームでやるときはご相談させていただきたいと思います。 有難うございました。
kei344

2017/01/03 10:46

あ、iframe内へのアクセスは別ドメインならちょっと無理ですが、そもそもどういう構成になっているかがわからないので、新たに質問される場合はそこを含めて詳しく書かれたほうが良いと思います。
tajix_japan

2017/01/03 10:56

了解しました。有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問