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

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

ただいまの
回答率

88.11%

Python selenium スクリーンキャプチャ

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 954

score 7

あるサイトのLP(縦に長いページ)をseleniumのスクリーンショットで1枚の画像として取得しようとしているのですがうまく行かないケースがあります。

ほとんどのページはうまく行くのですがどうも長すぎるとタイムアウトエラーになっているようです。
そのエラーの逃げ方がわかりません。

エラーになっているサイトは以下です。(違うpcでやると1度取得できたのですが。。。)
https://emerire.com/lp/tr_gs/

ご回答お願いいたします。

コードは以下になります

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

#ヘッドレスでdriver立ち上げ
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.set_page_load_timeout(60)

driver.get('URL')

#Webページの縦横サイズを取得し、ウィンドウを合わせる(そうしないと画面全体がスクショできない)
page_width  = driver.execute_script('return document.body.scrollWidth')
page_Height  = driver.execute_script('return document.body.scrollHeight')

driver.set_window_size(page_width,page_Height)

#スクリーンショット実行
driver.save_screenshot("/Users/ユーザー/Desktop/test/screenshot.png")
#ここでタイムアウトエラー発生
driver.quit()


エラー文

---------------------------------------------------------------------------
TimeoutException                          Traceback (most recent call last)
<ipython-input-85-6a7157172f9f> in <module>
----> 1 driver.save_screenshot("/Users/ユーザー/Desktop/test/screenshot.png")

/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in save_screenshot(self, filename)
   1053             driver.save_screenshot('/Screenshots/foo.png')
   1054         """
-> 1055         return self.get_screenshot_as_file(filename)
   1056 
   1057     def get_screenshot_as_png(self):

/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in get_screenshot_as_file(self, filename)
   1030             warnings.warn("name used for saved screenshot does not match file "
   1031                           "type. It should end with a `.png` extension", UserWarning)
-> 1032         png = self.get_screenshot_as_png()
   1033         try:
   1034             with open(filename, 'wb') as f:

/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in get_screenshot_as_png(self)
   1062             driver.get_screenshot_as_png()
   1063         """
-> 1064         return base64.b64decode(self.get_screenshot_as_base64().encode('ascii'))
   1065 
   1066     def get_screenshot_as_base64(self):

/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in get_screenshot_as_base64(self)
   1072             driver.get_screenshot_as_base64()
   1073         """
-> 1074         return self.execute(Command.SCREENSHOT)['value']
   1075 
   1076     def set_window_size(self, width, height, windowHandle='current'):

/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

TimeoutException: Message: timeout: Timed out receiving message from renderer: 10.000
  (Session info: headless chrome=83.0.4103.97)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

ページを開いた後に裏で何か(ajax?)が回っていてseleniumが待たされているのでしょう。
また、全部が表示されるまで確実に待ってもダメだったらPCのスペック不足かもしれません。(他のPCではできているようなので。)

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

#ヘッドレスでdriver立ち上げ
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)

driver.get('URL')

# 全表示まで待つ
current_source = ''
while current_source != driver.page_source:
    current_source = driver.page_source
    driver.execute_script('scrollTo(100, document.body.scrollHeight)')
    sleep(10)

#Webページの縦横サイズを取得し、ウィンドウを合わせる(そうしないと画面全体がスクショできない)
page_width  = driver.execute_script('return document.body.scrollWidth')
page_Height  = driver.execute_script('return document.body.scrollHeight')
driver.set_window_size(page_width,page_Height)

#スクリーンショット実行
driver.save_screenshot("/Users/ユーザー/Desktop/test/screenshot.png")

sleep(30) # この行不要かも

driver.quit()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/12 08:57

    回答ありがとうございます!
    一応待ったりもしてみたのですが
    うまくできません。
    PCスペックなのでしょうか。

    試しにdriverをchoromeからsafariに変えて実行してみたところうまくいきました。
    selenium ver. とchorome ver.の相性とかもあるのかもしれないです。。を

    キャンセル

  • 2020/06/12 09:28

    verは合わせないとうまく動きません。これは必須です。

    キャンセル

0

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

#ヘッドレスでdriver立ち上げ
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.set_page_load_timeout(10)

try:
    driver.get('https://emerire.com/lp/tr_gs/')
except:
    pass    
finally:
    #Webページの縦横サイズを取得し、ウィンドウを合わせる(そうしないと画面全体がスクショできない)
    page_width  = driver.execute_script('return document.body.scrollWidth')
    page_Height  = driver.execute_script('return document.body.scrollHeight')

    driver.set_window_size(page_width,page_Height)

    #スクリーンショット実行
    driver.save_screenshot("/Users/ユーザー/Desktop/test/screenshot.png")
    #ここでタイムアウトエラー発生
    driver.quit()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る