JavaScriptで変化させた後のサイトをrubyでスクレイピングする方法はありますか?
例えば、こちらのサイト
https://whowatch.tv/
をスクレイピングするとJavaScriptで変化させる前のソースをスクレイピングしてしまいます。
解決策があれば知りたいです。
どうぞ、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
Rubyの何を使ってスクレイピングしようとしているのか分からないですが、
基本的にJavaScriptを実行出来るのはChromeやFirefox等のブラウザだけです。
ブラウザがHTMLを読み込んだ後、
「お、このページCSSが付いてるやん」と画面の修飾を行い
「お、このページJavaScript書かれてるやん」とスクリプトを実行してDOMを書き換えます。
例えばRubyのスクレイピングを試みた場合、
よくある手法はHTMLをダウンロード→HTMLの静的解析を行うライブラリでの静的解析です。
RubyはJavaScriptを実行出来ますか?出来ませんよね?
HTMLを解析して人が読めるように一手間も二手間もかけて加工するからブラウザなのです。
Rubyはブラウザではないので、RubyにとってはHTMLというのはタダの文字列でしかありません。
RubyでHTMLを手に入れてもJavaScriptを実行してくれることはありません。
じゃあどうすればいいのか?
解決策は2つあります。
- JavaScriptで後付で描画したい情報に直接アクセス
- ブラウザ自体をスクリプトで無理やり動かして変更後のHTMLを手に入れる
後者は余り有益な方法ではないので先にさらっと紹介します。
GUIではなく、CLIやスクリプトから実行するブラウザを「ヘッドレスブラウザ」と呼びます。
昔はChromeの元になっているChromium等のブラウザを改変して作られたものが主流でしたが、
最近は要望を受けてChromeやFirefox等のブラウザを「ヘッドレスモード」で動かす方法に対応しています。
これを利用して、ブラウザをつかってお目当てのサイトにアクセス。
暫く待てばJavaScriptでDOMを書き換えるので、DOMの書き換えが終わるまで待ってからHTMLをローカルのテキストデータとして保存。
後からゆっくりRuby等のスクリプトを使って変更後のHTMLを解析という流れになります。
自動化するならば結構大変かと思います。
HTMLを抜き出すまではRubyとは関係ありませんしね…
この手で行くならヘッドレスブラウザ等の単語で検索してみてください。
本命の「JavaScriptで後付で描画したい情報に直接アクセス」に言及していきます。
まぁ、HTMLに含めたい情報なら先に格納すればいいんですよ。
それが出来ないってことは、「Ajax通信でJSONファイルを取得して、解析しながら表示」しているわけです。
100%とは言いませんが、9割方Ajax通信の手法です。
- F12キー等を使ってデベロッパーツールを開く
- Networkタブを開く
- XHR(Ajax通信)タブを開く
- 怪しい通信を開き「Response」タブを開く
高確率で貴方がスクレイピングをしてまで欲しい情報がJSON形式で手に入ることでしょう。
HTMLを静的解析するより、JSONを解析するほうが1万倍楽です。
このテクニックが通用するサイトではスクレイピングなど必要ありません。
投稿2018/03/08 04:11
編集2018/03/08 04:16総合スコア21158
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/08 15:13
2018/03/08 17:20
2018/03/09 04:03