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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

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

Q&A

解決済

1回答

4536閲覧

JavaScriptで変化させた後のサイトをrubyでスクレイピングする方法

nao_yasu

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

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

0グッド

0クリップ

投稿2018/03/08 03:36

JavaScriptで変化させた後のサイトをrubyでスクレイピングする方法はありますか?

例えば、こちらのサイト
https://whowatch.tv/
をスクレイピングするとJavaScriptで変化させる前のソースをスクレイピングしてしまいます。

解決策があれば知りたいです。
どうぞ、よろしくお願いします。

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

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

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

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

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

guest

回答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
miyabi-sun

総合スコア21158

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

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

nao_yasu

2018/03/08 15:13

返答ありがとうございます。 >本命の「JavaScriptで後付で描画したい情報に直接アクセス」 を試してみて、欲しい情報にたどり着きました。 しかし、手動でたどり着くことに成功しましたが、これらの情報をプログラムを用いて一定の感覚で取得する方法はありますでしょうか? よろしくお願いします。
miyabi-sun

2018/03/08 17:20

> 一定の感覚で取得する方法はありますでしょうか? タスクスケジューラーと呼ばれるジャンルの話になってきます。 Linuxでもっぱら使われるのはCrontabですかね。 https://ja.wikipedia.org/wiki/Crontab MacやWindowsにも同じようなCLIコマンドを定期的に発火する機能がありますので、 OS名+タスクスケジューラー等で検索かけてみて下さい。
nao_yasu

2018/03/09 04:03

>タスクスケジューラーと呼ばれるジャンルの話になってきます。 用語自体は聞いたことがあります。 OS名+タスクスケジューラー等で検索かけてみます。ご教授ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問