Почему Selenium и Chrome периодически падают на Raspberry Pi (Buster)? - PullRequest
1 голос
/ 23 октября 2019

Я ужасно переживаю, когда Selenium и Chrome надежно работают на моем Raspberry Pi (Buster), работающем без головы, чтобы поцарапать сайт. Я использую Pi 3 Model B, Rev 1.2 и использую Selenium 3.141.0 и Chrome & chromedriver версии 74.0.3729.157.

Приведенный ниже код работает в течение нескольких часов (вызывается cron каждые 15 минут), собирает данные, сохраняет их локально и использует запрос для публикации на внешнем веб-сайте. Но в течение 3 - 4 часов я получаю одну из следующих ошибок:

(<class 'selenium.common.exceptions.WebDriverException'>, WebDriverException()' '(<class 'selenium.common.exceptions.TimeoutException'>, TimeoutException()' '(<type 'exceptions.NameError'>, NameError("name 'display' is not defined",)

Даже при моей попытке поймать исключение ошибка приводит к полной остановке Pi, что требуетсброс питания.

Может кто-нибудь увидеть какие-либо ошибки в том, как я установил селен и хром в своем коде? Или рекомендовать улучшения? (это моя первая попытка с Selenium, и я использовал код из множества онлайн примеров и учебных пособий.)

Поддерживается ли Chrome 74 Raspbian buster? Я видел некоторые предположения, что поддержка Chromium для ARM была официально снята с v65, но я не видел официального объявления. Должен ли я отказаться от Chrome и попробовать Firefox?

#!/usr/bin/env python
# Designed as a once-thru program to be called by cron every 15 minutes

import time
from datetime import datetime, date
from selenium import webdriver
from pyvirtualdisplay import Display
import requests
import sys

try:
    options = webdriver.ChromeOptions()
    display = Display(visible=0, size=(1600, 1200))
    display.start()
    options.add_argument('--no-sandbox')
    driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver', options=options)

    # Navigate to target website
    driver.get('https://auth.tesla.com/login')

    # Sign in ...
    # Navigate to desired pages ...
    # scrape data, save to local files, use request to post to external website ...


except:    # catches ALL errors and writes them to file
    error_msg = sys.exc_info()
    with open(error_msg_file_name, "a") as error_file:
        error_file.write('\n')
        error_file.write(str((datetime.now().strftime('%Y-%m-%d %H:%M:%S'))))
        error_file.write(', ')
        error_file.write(str(error_msg))
        error_file.write('\n')

finally:      #this will always be executed
    driver.quit() # quit webdriver and cleanup before exiting```
...