Help us understand the problem. What is going on with this article?

Headless Chromeでにっちもさっちもいかないとき

More than 1 year has passed since last update.

Selenium + Headless Chromeでクローラを実装したけど途中で落ちてしまって原因もわからないとき、期待した結果が取得できないときの対策。

ログを出す

出力できるログは全て取る。

# Seleniumのデバッグログ (情報は少ない)
Selenium::WebDriver.logger.level = :debug
Selenium::WebDriver.logger.output = 'selenium.log'

# Chromeのログ (UserProfileに下に作成される。Linuxだと /tmp/.org.chromium.Chromium.AAAAA あたり) 
options = Selenium::WebDriver::Chrome::Options.new({
  args: ['log-level=0', 'enable-logging'],
})
# chromedriverのログ (find_element の実行結果とか全て記録されるので便利)
@driver = Selenium::WebDriver.for(:chrome, options: options, driver_opts: {
  log_path: 'chromedrive.log',
})

スクリーンショットを取る

エラーが発生したときの画面の状態をあとから確認する。

def save_screenshot(path)
  @driver.save_screenshot(path)
end

ソースを保存する

エラーが発生したときのソースをあとから確認する。

def dump_source
  filename = Digest::MD5.hexdigest(@driver.current_url)
  png_path = './log/%s.png' % filename
  html_path = './log/%s.html' % filename
  save_screenshot(png_path) # スクリーンショットとHTMLを同じファイル名にしておく
  File.open html_path, "w" do |writer|
    writer.puts @driver.current_url # 一緒にURLも出力しておくと便利
    writer.puts @driver.page_source
  end
end

ウインドウサイズを大きくする

ウインドウサイズが小さいとHTMLが崩れたりDOM要素が重なったりして意図しない結果になることがある。

options = Selenium::WebDriver::Chrome::Options.new({
  args: ['headless', 'start-maximized', 'window-size=1920,1080'],
})

日本語フォントを入れる

日本語フォントをインストールしておかないと文字化けする。たまにエラーで落ちたりする。

$ sudo yum install -y google-chrome-stable libOSMesa google-noto-cjk-fonts ipa-gothic-fonts.noarch ipa-mincho-fonts.noarch

タブの状態をログに出力する

実装が悪いとエラー発生時にタブが残ってしまい動作が不安定になるので、ちゃんとタブが閉じられているかチェックするためにログに出力しておく。

logger.info('タブ: %d' % @driver.window_handles.size)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした