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

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

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

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

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

selenium

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

Q&A

2回答

5190閲覧

SeleniumのTimeout設定の書き方

decatail

総合スコア41

Ruby

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

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

selenium

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

0グッド

0クリップ

投稿2021/12/23 03:47

編集2021/12/28 03:21

下のプログラムのTimeout設定、Option設定の書き方は誤っているでしょうか。

Ruby

1require 'selenium-webdriver' 2 3# caps = Selenium::WebDriver::Remote::Capabilities.firefox("moz:firefoxOptions" => {args: ["--headless"]}) 4# driver = Selenium::WebDriver.for :firefox, capabilities: caps 5 6options = Selenium::WebDriver::Firefox::Options.new 7options.headless! 8options.add_argument('--no-sandbox') 9options.add_argument('--disable-gpu') 10options.add_argument('--disable-desktop-notifications') 11options.add_argument('--ignore-certificate-errors') 12options.add_argument('--allow-running-insecure-content') 13options.add_argument('--disable-web-security') 14options.add_argument("--disable-extensions") 15options.add_argument('--blink-settings=imagesEnabled=false') 16options.add_argument('--lang=ja') 17 18driver = Selenium::WebDriver.for :firefox, capabilities: options 19driver.manage.timeouts.page_load = 300 20 21count = 0 22begin 23 driver.get "https://example.com" 24rescue => e 25 count += 1 26 retry if count < 5 27 puts "無理だった" 28 puts e 29end 30 31driver.quit

このプログラムをConohaという安いVPSで動かそうとしています。私が持っているPC上では正常に動くことが確認できています。上のプログラムは「driver.get」の行を最大5回動作させようとしています。本来ならば1回で済ませたい所なのですが、メモリが512MBで、CPUが1コアのVPS上では性能面での問題なのか、以下のようなエラーメッセージが出る場合が多々あります。

/home/VPSUSER/.rbenv/versions/3.0.1/lib/ruby/3.0.0/net/protocol.rb:219:in `rbuf_fill': Net::ReadTimeout with #<TCPSocket:(closed)> (Net::ReadTimeout)

タイムアウトになるのであれば、その時間を延ばせば良いのだと思って、思いきって5分にしています。こちらを参考にしました。しかし動作させてみると60秒程度で上のメッセージが出てきてしまいます。これはロード時間のタイムアウトの設定の仕方がおかしいのだろうと思うのですが、どなたか分かる方いらっしゃいますでしょうか。

また、「options.add_argument」の書き方についても、あっているか自信が無いのでこれも正誤チェックできましたら、お願い申し上げます。すくなくとも「options.headless!」はきちんと動作していることは確認できていますが、その他の項目については自身で確認する手段がございませんのでよろしくお願い申し上げます。

持参のPC

OS: macOS 12.1 21C52 arm64 Host: MacBookAir10,1 Kernel: 21.2.0 Uptime: 4 days, 23 hours, 29 mins Packages: 36 (brew) Shell: zsh 5.8 Resolution: 3840x2160 DE: Aqua WM: Quartz Compositor WM Theme: Blue (Light) Terminal: Apple_Terminal Terminal Font: RictyDiminishedDiscord-Regular CPU: Apple M1 GPU: Apple M1 Memory: 2864MiB / 16384MiB ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20] selenium-webdriver (4.0.3)

VPS

OS: Ubuntu 20.04.3 LTS x86_64 Host: OpenStack Nova 2014.2-2.el7.centos Kernel: 5.4.0-91-generic Uptime: 12 days, 2 hours, 38 mins Packages: 1252 (dpkg), 7 (snap) Shell: fish 3.1.0 Resolution: 1024x768 Terminal: /dev/pts/1 CPU: Intel Xeon E5-2650 v3 (1) @ 2.294GHz GPU: 00:02.0 Vendor 1234 Device 1111 Memory: 116MiB / 478MiB ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux] selenium-webdriver (4.1.0, 4.0.3, 3.142.7) Mozilla Firefox 95.0.1

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

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

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

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

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

guest

回答2

0

憶測での回答になりますが、2つ程思ったことがあります。

対象サイトがConohaを拒否している

試しに別のサイトにアクセスしてみたところすんなり行くようでしたら、
AWS、GCPなどのサービスからのアクセスを全遮断するようにその対象サイトが作られている可能性があります。

なので串を刺す必要があります。
自分の過去のプログラムを調べたら以下のような記述がありました。
多分rubyにも同じようなものがあると思います。

python

1from selenium.webdriver.chrome.options import Options 2opt=options.add_argument('--proxy-server=http://123.456.789.012:1000') 3driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=opt)

Firefoxを利用している

これは完全な自分の想像での回答で全く信用できない話と思っていただきたいのですが、
特別な理由がない限りSeleniumはChromeを利用した方がいいです。
私も過去に「FirefoxだとできなかったけどChromeならできた」経験がありますが、
その逆は未経験です。

投稿2022/01/03 01:42

shirai

総合スコア1290

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

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

decatail

2022/01/03 03:48

コメント大変ありがとうございます。 「対象サイトがConohaを拒否している」可能性については、私は考えにくいと思います。というのは、大抵はちゃんと動くからです。しかし、タイミングによっては時間切れで動かない場合があるのです。この質問の趣旨としては、「文法の誤り等はないか」というものですが、それはこのプログラムで画像非表示やタイムアウト設定などがきちんと動作していないと見受けられるからです。この問題はお金を払ってVPSのスペックを上げれば解決すると考えています。読込み時間が早くなるからです。しかし、将来的にはラズベリーパイなどでも動かしたいので、出来ればこの設定方法について知見を深めることが出来ればと思います。 二点目の「Chromeを使ったほうが良い」という点についてですが、おっしゃる通りだと思います。Web検索すると大抵はChromeを使っていますね。これは私のこだわりでFirefoxにしているのだということです。言い換えるとChromeは使いたくないということです。更に言えば、RubyよりもPythonを使ったほうがいいのでしょう。これは単にPythonについて無知だから、多少は知っているRubyをつかっているのですが、いつかはPython、それでも動かないなら仕方なくChromeDriverを使ってみようかと思います。 ありがとうございました。
decatail

2022/01/03 04:07

解法の一つには、成功するまで何回も取得を試みるというものがあります。上記のコードも5回取得を試みています。現状ではこれで動かしています。しかし、相手のサーバーに出来るだけ負担をかけたくないので、1回で決める方法があればそちらが望ましいと考えています。
shirai

2022/01/06 04:31

頂いたコメントを見て思ったのですが、対象サイトのサーバのスペックがしょぼい可能性は無いですか? 時によってうまくいく、いかないがあるのなら、たまたまそのとき対象サイトにアクセス負荷がかかっていたとも考えられます。 というのもこちら側が低スペックという理由だけだと、たかだかこれだけのプログラムで時によってうまく行かなくなるという事態が想定しにくいです。 で、この仮説が正しければこちらをどう変更しようと無理があるという結論になります。 仮説が正しいかを検証するには実際にスペックをあげてみれば分かると思います。 見たところプログラムにまずい点は見受けられないです。
decatail

2022/01/08 02:23

コメントありがとうございます。 >> 対象サイトのサーバのスペックがしょぼい可能性 なるほど、それについては書きわすれていました。結論から言えば無いですね。理由としては当方のMac環境では確実に動くからです。となるとVPSのスペックが低いことによるウェブサイトの読込み時間がかかることが直接的な原因としか私は考えられないかなと。また、JavaScriptを使用しないサイトについてはSeleniumでなく、Nokogiriでスクレイピングしていますがその場合はタイムアウトエラーはありません。 当方のMacbookAirだとめちゃめちゃさくさく動くんですよ。で、RAMが512MBで1コアCPUのVPSだと動かないことがあるのですね。エラー内容は上記しましたがタイムエラーでした。調べるとどうやら60秒以上ロードしていると強制終了してしまうようです。 解法としては3つあると思っています。 1つは60秒以上読み込みできるようにするのが一番楽かなと思ったのですが上記のコードを書いてみてもやはりタイムエラーになる時はなるようです。たとえば上記の例のように300と指定すれば、5分間は持ちこたえてくれるのかなと思いきや、60秒でタイムアウトエラーを履き出してきました。ですからこの書き方だとタイムアウト設定がうまくいっていないのかなと。 2つ目は画像の読込みをなくせば、その分読込み時間は早くなるだろうと。必要なのは特定の文字列だけですので、画像の読込みは必要ないのです。タイムアウト設定が効かずとも60秒以内に終われば良いわけです。よくわかっていないですがラズベリーパイでスクレイピングをする例としてGPUだとかサンドボックスをOFFにする処理があるようでそれも含めてコピペしています。これがうまく動いているかどうかを確かめる手段はないので何とも言えないのですが、しかしMac上でheadless処理を外した上で、動作させるとブラウザには画像ががんがん出てきたので、これはもしかすると上手くいっていないのではないか?と、思ってしまいました。 3つ目は特定の部分のロードが終われば処理を終了するという手法です。しかし、これについてはrubyだと書き方が見当たりませんでした。 しかし、プログラムに不味い点は無いということで、そうなるとスペック以外の環境の問題ということかも知れませんね。また、JavaScriptを使用しないサイトについてはNokogiriでスクレイピングしていますが、その場合はタイムアウトエラーなどで困ったことはありません。 オプションの書き方はラズベリーパイでスクレイピングを試みた例がいくつか見当たりまして、そこから拝借しています。しかしRaspberry Piは今はRAM8GBで4コアらしいですね。 https://www.switch-science.com/catalog/6370/ いまの1コア512MBのVPSよりも高性能ですね。コメントありがとうございます。
decatail

2022/01/08 02:39

「時によってうまくいく、いかないがある」というのはロード時間が60秒を超える事があるという事と言い換えられると思います。Macとeo光だと30秒はかからないのですよね。ですからタイムアウト設定が無くともうまくいくわけです。低スペックだとロード時間が遅くなる事があるのか、あるいはVPS事業者側が通信速度に制限をかけているのか。後者であるならばVPSのスペックを上げることは問題の解決にはならないかもしれません。
guest

0

同じところで詰まりました。
恐らくこのような書き方でSelenium::WebDriver.forhttp_clientを渡すとタイムアウトが設定できると思います。

ruby

1client = Selenium::WebDriver::Remote::Http::Default.new 2client.read_timeout = 200 3 4session = Selenium::WebDriver.for :chrome, capabilities: caps, http_client: client 5# session.manage.timeouts.implicit_wait = 200 6# session.manage.timeouts.page_load = 200 7# session.manage.timeouts.script = 200

投稿2022/07/31 23:33

sink66

総合スコア88

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問