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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

JavaScript

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

5131閲覧

Ruby版のseleniumを使ってJavascriptを利用されたサイトからデータを取得する

uraxurax

総合スコア7

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

JavaScript

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2018/10/07 20:10

編集2018/10/08 12:02

Ruby版のseleniumを使って下記サイトからデータを取得できたらと思っています。
https://www.athome.co.jp/tochi/tokyo/chiyoda-city/list/

そこで下記のRubyのスクリプトを書いて実行してみましたが、

require 'selenium-webdriver' options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36') driver = Selenium::WebDriver.for :chrome, options: options url = 'https://www.athome.co.jp/tochi/tokyo/chiyoda-city/list/' driver.get url puts driver.page_source

結果として、期待していたJavaScript実行後の出力ではなく、JavaScriptが実行前の下記のような出力しか得られませんでした。

取得できた出力(JavaScript実行前)

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta name="ROBOTS" content="NOINDEX, NOFOLLOW" /> <meta http-equiv="cache-control" content="max-age=0" /> <meta http-equiv="cache-control" content="no-cache" /> <meta http-equiv="expires" content="0" /> <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="refresh" content="10; url=/distil_r_captcha.html?requestId=27042986-1ddf-4249-bd39-65ee8c7c7f24&amp;httpReferrer=%2Ftochi%2Ftokyo%2Fchiyoda-city%2Flist%2F" /> <script type="text/javascript"> (function(window){ try { if (typeof sessionStorage !== 'undefined'){ sessionStorage.setItem('distil_referrer', document.referrer); } } catch (e){} })(window); </script> <script type="text/javascript" src="/eadjaxlayqcmrfpn.js" defer=""></script><style type="text/css">#d__fFH{position:absolute;top:-5000px;left:-5000px}#d__fF{font-family:serif;font-size:200px;visibility:hidden}#vvubettawbsvtzescreurufstevtezrzbx{display:none!important}</style></head> <body> <div id="distilIdentificationBlock"> </div> </body></html>

取得したい実行結果(JavaScript実行後)

<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title>千代田区の土地 物件検索結果【アットホーム】|土地購入の情報[売地・宅地・分譲地]</title> <meta name="keywords" content="千代田区 土地,東京都 土地,物件検索結果,土地,売地,宅地,分譲地,購入,情報,検索,探し,athome,アットホーム"> <meta name="description" content="【アットホーム】東京都 千代田区の土地の物件検索結果ページ。土地・不動産の情報サイト アットホームなら、ご希望にぴったりの売地が簡単に検索できます。その他、東京都 千代田区の土地探しに役立つ相場情報など宅地の情報が盛りだくさん。売地のことならアットホームにお任せください。分譲地の情報を毎日更新中。"> <meta name="robots" content="index,follow,noarchive"> <link rel="canonical" href="https://www.athome.co.jp/tochi/tokyo/chiyoda-city/list/"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"> <!-- 長いため途中抜粋 --> </html>

おそらく上記サイトは、JavaScriptが使用されているサイトでJavaScriptが実行される前のソースが取得されている状況だと思うのですが、
JavaScriptが実行された後のデータを取得するにはどのようにしたらよいのでしょうか?

下記サイト等にはdriver.execute_scriptを使うような記載があるのですが、そのような処理を行えばよいのでしょうか?
JavaScriptに詳しくないため、execute_scriptに渡すべき引数がピンとこず試行錯誤しているのですが情報をいただけますでしょうか?

https://morizyun.github.io/web/selenium-cheat-sheet.html

追記

chrome以外にもfirefoxのheadless modeがあると聞いたので、chromeとfirefoxでコマンドラインから下記のコマンドを実行してみました。

その結果、google-chromeは真っ白な画面の一方、firefoxはちゃんとしたscreen shotがとれました。
そのそもコマンドラインでうまく動かなそうなのは問題だと思うのでfirefoxでの実装に切り替えたいと思います。

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

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

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

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

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

m.ts10806

2018/10/07 21:33

提示のコードだけ見るとJavaScriptでしているのはLocalstorageへの保存のみで何も画面に出力など行っていません。得たい「実行後のコード」とはどのような結果を期待していますか?
m.ts10806

2018/10/07 21:40

↑ちょっと勘違いしていたかもしれません。もし要件と違うようでしたらスルーしてください
m.ts10806

2018/10/07 21:41

念のため「スクレイピング」をタグに追加しておいてください。
uraxurax

2018/10/07 22:52

具体例とタグについて追記させていただきました。
wwbQzhMkhhgEmhU

2018/10/07 23:26

driver.execute_scriptはテスト用にイベントを発行したりするのに使うような気がします
uraxurax

2018/10/07 23:35

情報ありがとうございます。execute_scriptではなく別の方法で取得しなければいけないということですね。
guest

回答1

0

ページロードが追いついていないだけな気もします。
puts driver.page_source の前にsleepを入れて見ましたが、
at homeのページ自体は取得できました。

投稿2018/11/10 08:34

編集2018/11/10 08:35
oh_rusty_nail

総合スコア319

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

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

uraxurax

2018/11/10 23:10

sleepは、どれくらいいれてathomeのページを取得できたか教えていただけますでしょうか。 また、どのようなページが取得できましたでしょうか。 sleepを入れることで確かに違う出力を得られるのですが、取得したページのタイトルは"不正な登録を防ぐため、認証にご協力ください。"となっていました。 これは最初に取得したページの下記の条件に引っかかり10秒後にRefreshされているのかと考えています。 > <meta http-equiv="refresh" content="10; url=/distil_r_captcha.html?requestId=27042986-1ddf-4249-bd39-65ee8c7c7f24&amp;httpReferrer=%2Ftochi%2Ftokyo%2Fchiyoda-city%2Flist%2F" /> どうもボット判定されているようなのでうまい回避方法があればと思っているのですが、やり方が間違っていましたらご指摘お願いいたします。
oh_rusty_nail

2018/11/11 23:42

sleep は5secで私も同じ画面を取得しました。 初回だけはsleep入れずにやって、「取得したい実行結果(JavaScript実行後) 」の画面が取れました。 それ以降はsleepを挟まないと画面が描画される前に落ちていたためsleepを挟みましたが、ボット判定されました。 そのページ自体もHTMLなのでボット回避できるのかもしれませんが詳しくは見ていませんでした。 ボット判定される条件を調べた方が良さそうですね。 アクセス時にブラウザ上部に出ているChromeの警告が関係しているかもしれません。 警告はheadless起動せずにアクセスすれば確認できます。
uraxurax

2018/11/13 08:57

確かに、警告のiマークがでちますね。 何が原因で、ボット判定されているのか確認するのが近道そうですね。
oh_rusty_nail

2018/11/14 00:06

ボット認証の画面に書かれているように、 Javascriptの設定を無効にするとSeleniumを介さなくてもボット判定の画面でますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問