前提・実現したいこと
Capybara でクローラーを作ろうとしてます。
まずは、単純にサイトにアクセスしてスクリーンショットを撮ることころから始めようとしたのですが、しょっぱなからつまずいています。
(いわゆるテストではなくてクローラーです。Mechanize だと Javascript が扱えないので、乗り換えを企図してます。)
ウェブドライバー側に原因がありそうなのですが、具体的な対処法がわかりません。
(インストールし足りないものがあるのか?設定が間違っているのか?)
発生している問題・エラーメッセージ
後記スクリプトを実行するとこのエラーになります。
Traceback (most recent call last): 19: from lib/crawler.rb:22:in `<main>' 18: from lib/crawler.rb:17:in `start_scraping' 17: from lib/crawler.rb:17:in `tap' 16: from lib/crawler.rb:18:in `block in start_scraping' 略 1: from /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:34:in `initialize' /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:72:in `assert_ok': unknown error: Chrome failed to start: exited abnormally (Selenium::WebDriver::Error::UnknownError) (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
シェルから直接次のように実行すると、エラーが出るのですが(ワーニングはとりあえず無視)、スクリーンショットは撮れてしまいます。
chromium-browser --headless --disable-gpu --screenshot --no-sandbox --disable-dev-shm-usage https://www.teratail .com
sh
1[0329/122614.302251:WARNING:dns_config_service_posix.cc(341)] Failed to read DnsConfig. 2[0329/122614.444994:ERROR:gl_implementation.cc(282)] "Failed to load /usr/lib/chromium/swiftshader/libGLESv2.so: Error loading shared library /usr/lib/chromium/swiftshader/libGLESv2.so: No such file or directory" 3[0329/122614.449670:ERROR:viz_main_impl.cc(180)] "Exiting GPU process due to errors during initialization" 4[0329/122614.460360:WARNING:gpu_process_host.cc(1213)] The GPU process has crashed 1 time(s) 5[0329/122614.474090:WARNING:dns_config_service_posix.cc(341)] Failed to read DnsConfig. 6[0329/122614.571643:WARNING:gpu_process_host.cc(982)] Reinitialized the GPU process after a crash. The reported initialization time was 0 ms 7[0329/122614.573588:ERROR:gpu_channel_manager.cc(450)] "ContextResult::kFatalFailure: Failed to create shared context for virtualization." 8[0329/122615.273748:ERROR:child_process_sandbox_support_impl_linux.cc(79)] "FontService unique font name matching request did not receive a response." 9[0329/122615.278219:ERROR:child_process_sandbox_support_impl_linux.cc(79)] "FontService unique font name matching request did not receive a response." 10 11略 12 13[0329/122620.627196:INFO:headless_shell.cc(620)] Written to file screenshot.png.
上記エラー中
/usr/lib/chromium/swiftshader/libGLESv2.so
がないと言われてるのですが /usr/lib/libGLESv2.so
にはあります。
ln -s /usr/lib/libGLESv2.so /usr/lib/chromium/swiftshader/libGLESv2.so
をしても変わりなかったです。)
該当のソースコード
ruby
1require 'capybara' 2require 'selenium-webdriver' 3 4Capybara.register_driver :selenium do |app| 5 Capybara::Selenium::Driver.new(app, 6 browser: :chrome, 7 desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome( 8 chrome_options: { 9 args: %w(headless disable-gpu window-size=1280,800 no-sandbox disable-dev-shm-usage), 10 }, 11 ) 12 ) 13end 14Capybara.javascript_driver = :selenium 15 16def start_scraping(url, &block) 17 Capybara::Session.new(:selenium).tap { |session| 18 session.visit url 19 session.instance_eval(&block) 20 } 21end 22start_scraping 'https://www.teratail.com/' do 23 p title 24 save_screenshot 25end 26
試したこと
Docker上の環境でやっています。apkでインストールしてるのはつぎのとおり
apk --no-cache update && apk --no-cache upgrade && apk --no-cache --update add \ cups-client \ nodejs \ yarn \ tzdata \ sqlite \ git \ postgresql-dev \ libc-dev \ libxml2-dev \ libxslt-dev \ linux-headers \ ruby-dev \ zlib-dev \ yaml-dev \ sqlite-dev \ build-base \ less \ mesa-dev \ udev \ chromium-chromedriver chromium
補足情報(FW/ツールのバージョンなど)
Alpine Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) )
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]
chromium-browser Chromium 79.0.3945.130
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。