• 締切済み

動的なページのスクレイピング

動的なページのスクレイピング まず下記のurl御覧ください。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q131988243... これで「静的なページの」スクレイピングできるようになったはいいのですが、問題はここからです。 https://sv.j-cg.com/compe/view/entrylist/1489 ↑このような、「ある程度スクロールすると追加でコンテンツが読み込まれるページ」については、正しくスクレイピングできませんでした。 「JavaScriptを実行させて、変化後の要素を取得する」ためにヘッドレスブラウザ(phantomjs)を使っているはずなのに、これは腑に落ちなさすぎるんですが。。 ググったところ、やっぱり「phantomjsを使う」のは正しい解決法のようなんですが、 (これとか→https://ja.stackoverflow.com/questions/19681/nokogiri%E3%81%A7%E5%8...) やっぱり追加後のDOM?については解析できませんでした。 JCGのサイトについてはスクロール時に読み込まれるのはjavascriptの仕様ではないのか、はたまたコードがよくないのか… 教えてください。

  • Ruby
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

実ブラウザ上でスクロールしないと読み込まれないなら ヘッドレスブラウザ上でもスクロールしないと当然ダメです。 phantomjs scrolldown くらいの検索語で調べればコードはすぐわかるでしょう。

ont_rt
質問者

お礼

あ、なんか調べたいページが出ちゃってますが… スクレイピング対象は特に気にしないでいただけるとありがたいです

ont_rt
質問者

補足

rubyのcapybaraを通してphantomjsを動かしているんですが session.visit "https://sv.j-cg.com/compe/view/entrylist/1489" session.execute_script('window.scroll(0,1000);') や session.visit "https://sv.j-cg.com/compe/view/entrylist/1489" execute_script("window.scrollBy(0, window.innerHeight);") を使ってもスクロールされたデータが取れないので今回質問しました 調べてもrubyでの書き方はわかりません(こういうのhttps://stackoverflow.com/questions/33484890/how-to-access-elements-from-finite-scroll-with-capybara-poltergeist-and-railsを参 考にしても。) 正しい表記法を教えてください。

関連するQ&A

  • Nokogiriスクレイピングがうまくできない。

    Nokogiriスクレイピングがうまくできない。 RubyのNokogiriを利用して、下記サイトのデータを整理するためにスクレイピングをしようと思っています。 https://sv.j-cg.com/compe/view/entrylist/1274 具体的には、サイト中部の「登録デッキ」の一覧にある使用クラスのデータをまとめるプログラムを組もうと思っています(添付画像参照)。 XPathのサイトを参考にしつつ、試しにこの使用クラスの画像データをテキストで出力するため以下のコードを組んで実行しました。 require 'nokogiri' require 'open-uri' url = 'https://sv.j-cg.com/compe/view/entrylist/1274' charset = nil html = open(url) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) p doc.xpath('//img[contains(@src,"clans")]') ですが、 [] と表示されるだけで何も取得できません。 containsの引数を(取得対象のimg要素内の)どの値に変えて試しても、色んな表示が出はするのですが肝心の画像URLの部分が取得できません。 (ページのソースコードを見た所、使用クラスの判別が画像URLでしか出来ないため、URLをまず取得しないことには目的を達成できないだろう、という前提で話しています。) 私の推測では、どうやらURL部分だけjsonファイルらしい(他者には見られない)外部のファイルから引っ張ってきているため、プログラムから読み取ろうとしてもうまくURLを引用できないのだと思ってます。 ですが、ブラウザ上の検証ツールではURLが表示されるのにプログラムでは正しく読み込めないのが疑問です。 何にせよ、うまく使用リーダーを整理する方法があったら教えていただきたいと思います。 (ちなみにスクレイピングで画像URL等を取得した後のうまい整理方法も現段階ではよくわかっていないですが、とりあえずこのURLデータ取得だけでもまず理解してからということで質問をしています。)

  • スクロールしてページトップへ

    「ページトップへ」のようなリンクがあって、クリックするとスクロールしてページトップでゆっくり止まるような(参考:http://www.endoritsuco.com/disc.html、http://www.mienai.com/about_orthodontics/index.html等)javacsriptを探しています。 javascriptは初心者なので、どこかでスクリプトを配布してたりすると嬉しいのですが。 書籍でも構いませんので情報をいただければと思います。

  • pythonでスクレイピングがうまく出来ません

    python2.7でbeautifulsoupを用いて、netkeiba.comから競馬情報(騎手の成績)をスクレイピングしています。 定法に基づきまして、『検証』からページのツリー構造を把握して、プログラムを作成しました。 馬名部分の構造が<td class="txt_l"> <a href="/horse/2011105901">テンテマリ</a></td> #テンテマリは馬名 となっておりましたので、"txt_l"を拾い出せるようにスクリプトを作りました。 しかしながら、 馬名以外の"txt_l"は全部スクレイピング出来るのですが、馬名部分だけがNoneと返ってまいります。 エラーメッセージではありませんが、何が原因でNoneとなるのかが、どうしても分かりません。 ちなみに、馬名以外で、ほぼ同様の構造を持つ、『レース名』、構造は <td class="bml txt_l"> <a href="/race/201603020812/" title="3歳上500万円下">3歳上500万円下</a> (3歳上500万円下はレース名) では、問題なくレース名を拾うことが出来ました。 該当のソースコード -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange( 1, 2 ): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: lrg1 = tr.findAll('td',{'class':'txt_l'}) for tr1 in lrg1: print tr1.string 試したこと 馬名以外の('td',{'class':'txt_l'})に準ずる『レース名』は、うまく拾うことが出来ました。 lrg1 = tr.findAll('td',{'class':'txt_l'}) で馬名を得ることが出来ない理由、併せて馬名を拾えるスクリプトを御教示くださいますよう、よろしくお願いいたします!

  • Ruby初学者です。

    Ruby初学者です。 スクレイピングをしています。 Capybara + PhantomJSを用いているのですが(動的要素も取得したいため)、 session.visit "sample.com" variable = session.find_all(:xpath,"//a[contains(text(), "なんとか")]") puts variable といったコードを書くと #<Capybara::Result:0x0325d6honyaefccf0f8> という風な表示がされてしまいます。 上記の例に限らず、xpathで抽出したものをputs等を用いて表示しようとすると、上述のようにわけのわからん表示が出てきて困ります。 Nokogiriだとputsを使うとDOM?html?がそのまま文字通り表示されてくれるのですが。。 Capybaraだと何らかの変換を行うような処理がされてしまっているのですかね。(というかputsでコードを表示するような目的のものではない?) 解決方法(抽出したコードをputsでそのまま表示する方法)があれば教えてください。

  • javascriptのページが見れない!?

    IE6.0 セキュリティ 既定の中 アクティブスクリプト有効 Cookie 有効 プライバシーを低 www.uniqlo.comを常に許可で追加していますがユニクロのホームページが表示されません。 キャッシュをクリア、再起動しても変わりません。 http://eiganohanamichi.comもページが表示されましたとなりますが、画面下8割ぐらいが真っ白で表示されません。ステータスバーにJavascript void(0)とあります。 javascriptが何か関係あるのでしょうか。よろしくお願いします。

  • スクレイピングで取得した文字を変数表示

    javascriptでiphoneアプリを作成中です。 ゲームにあたり、自社サーバーのhoge.ne.jp/read1000.php上のデータベース 情報をスクレイピンクしてiphone上で表示させます。 下記により、「hoge.ne.jp/read1000.php」にあるソースの中から 「吉本」の文字をスクレイピング表示することが可能です。 ****【hoge.ne.jp/read1000.php】(DBサーバー)********************        <td class="class3_sql_name">吉本</td> ****【hogehoge.com/index.html】(iphone仮想サーバー)**************   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript" src="./js/jquery.xdomainajax.js"></script> <script> url = 'http://hoge.ne.jp/read1000.php'; $.get(url, function(data){ var content3_sql_name = $(data.responseText).find('.class3_sql_name').text(); $("#text3_sql_name").text(content3_sql_name); }); </script> <div id="text3_sql_name"></div>  //←この部分にhoge.ne.jpからスクレイピング                       した吉本の文字が表示される ************************************************************ やりたいこと ここで取得できた「吉本」の文字を変数としてjavascript上で表示させたいと考えています。 下記のようにしたのですがグローバル変数、ローカル変数とも表示出来ません。 どうすれば表示できるでしょうか? ****【hogehoge.com/index.html】(iphone仮想サーバー)************* <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript" src="./js/jquery.xdomainajax.js"></script> <script> url = 'http://hoge.ne.jp/read1000.php'; $.get(url, function(data){ var content3_sql_name = $(data.responseText).find('.class3_sql_name').text(); $("#text3_sql_name").text(content3_sql_name); //テスト用としてグローバル変数追加 content3=$("#text3_sql_name").text(content3_sql_name); }); </script> <script> document.write(""+content3_sql_name+""); </script> <script> document.write(""+content3+""); </script>  ↑上記のふたつとも表示出来ない 宜しくお願い致します。

  • 標準の印刷機能では印刷できないWebページ

    ほんの一例ですが、下記のリンクのようなWebページを印刷する方法はありますか? スクロールすると5ページ位あるのですが、Chrome/Edge/Firefoxで単純に印刷しようとしても1ページ目のしかも右が欠けたページしか印刷の対象になりません。 https://cloud.google.com/find-a-partner/?search=%E6%97%A5%E6%9C%AC

  • IEでAmazonだけスクロールが遅い

    こんばんは Win 10, IE 11, CPU Core i5 4690, 8GBメモリ, SSDです。PCのスペックは十分と思います。 最近Amazonでのブラウジングが遅いです。具体的にはトップページは問題なく、商品ページのみ遅いです。ページの表示は一瞬でされるのですがスクロールが操作とタイムラグがあり、カクカクしてその間は他の操作を受け付けません。 他のサイトではこのような現象はありません(例えば写真やバナーの貼り込みがエグい楽天の商品ページでもすいすいスクロールできます)。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11137468636 https://freesoft.tvbok.com/web/ie/refresh-do-not-track.html https://freesoft-concierge.com/internet/internet-explorer-action-approach/ これらの方法はすべて試しましたが改善しませんでした。 なおIEでなくEdgeだとこの現象は起こらないのですがEdgeはなんとなく使いにくいのであまり使いたくありません。 また「(さほどページが重いとは思えない)Amazonでのみ」「スクロールのみが遅くなる」という現象の原因を知りたい気がします。解決法はないでしょうか。

  • JavaScriptを使って縦に画像がスクロールするページを作りたいの

    JavaScriptを使って縦に画像がスクロールするページを作りたいのですが、 (こんなかんじで動く)http://www.gmarwaha.com/jquery/jcarousellite/index.php 私はまだ勉強中で、テンプレートをダウンロードして少々いじって使う程度しかできません。 テンプレートで縦に動くものをみつけたのですが http://sorgalla.com/jcarousel/ 画像や全体の幅を広げようとまずCSSで調整したら、画像は大きくなったけど、 全部縦に画像がうまく並ばず、何枚も画像が表示されるはずなのに、1枚しか表示されなくなりました。 矢印ボタンを押してスクロールさせようとすると、 表示枠は長くしてあるのに、一番上の画像が別の画像に切り替わるという感じです。 言葉だけではうまく伝わらないとは思いますが。。 一番上に記載したURLのやつを縦バージョンにする方法など、 あったら教えていただけないでしょうか? 他にも、縦にスクロールするJavascriptをご存知の方いらっしゃいましたら、教えていただけると助かります。 他力本願で大変お恥ずかしいのですが、どなたかうまく作れる方法がありましたらご協力お願いします!!

  • ページの現在地による要素へのclassの追加

    現在ホームページを作成しようとしていまして、HTML5で書かれているサイトを見て回っていましたら、東京大学TLOのサイト(http://www.casti.co.jp/)にたどり着きました。 このサイトでは、ページをスクロールすると、ページ左側のナビゲーションがページに同調して、表示されたセクションのリンクが選択された状態になります。 FirefoxのアドオンであるFirebugでソースを監視しながら見ていると、表示されているセクションをリンクしているli要素に、class="current"が追加されています。個人的には、javascriptか、それで記述されたJQueryで、表示領域の特定とclassの追加を行っていると思うのですが、ソースにそのような記述がありません。私がjavascriptやJQueryにあまり明るくないために見つけられないだけかもしれませんが。。。 面白い技術ですので、ぜひ理解し、できれば今後のHP作成に生かしたいと思うのですが、どなたか説明していただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • CSS