Невозможно создать задание crontab для моей программы scrapy

Я написал небольшой скребок Python (с использованием среды Scrapy). Скребок требует безголового просмотра ... Я использую ChromeDriver.

Поскольку я запускаю этот код на сервере Ubuntu, у которого нет графического интерфейса, мне пришлось установить Xvfb, чтобы запустить ChromeDriver на моем сервере Ubuntu ( Я следовал этому руководству )

Это мой код:

class MySpider(scrapy.Spider):
    name = 'my_spider'

    def __init__(self):
        # self.driver = webdriver.Chrome(ChromeDriverManager().install())
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        self.driver = webdriver.Chrome('/usr/bin/chromedriver', chrome_options=chrome_options)

Я могу запустить приведенный выше код из оболочки Ubuntu, и он будет выполняться без каких-либо ошибок:

ubuntu@ip-1-2-3-4:~/scrapers/my_scraper$ scrapy crawl my_spider

Теперь я хочу настроить задание cron для запуска приведенная выше команда каждый день:

# m h  dom mon dow   command
PATH=/usr/local/bin:/home/ubuntu/.local/bin/
05 12 * * * cd /home/ubuntu/scrapers/my_scraper && scrapy crawl my_spider >> /tmp/scraper.log 2>&1

, но задание crontab выдает следующую ошибку:

Traceback (most recent call last):
  File "/home/ubuntu/.local/lib/python3.6/site-packages/scrapy/crawler.py", line 192, in crawl
    return self._crawl(crawler, *args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/scrapy/crawler.py", line 196, in _crawl
    d = crawler.crawl(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/twisted/internet/defer.py", line 1613, in unwindGenerator
    return _cancellableInlineCallbacks(gen)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
    _inlineCallbacks(None, g, status)
--- <exception caught here> ---
  File "/home/ubuntu/.local/lib/python3.6/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    result = g.send(result)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/scrapy/crawler.py", line 86, in crawl
    self.spider = self._create_spider(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/scrapy/crawler.py", line 98, in _create_spider
    return self.spidercls.from_crawler(self, *args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/scrapy/spiders/__init__.py", line 19, in from_crawler
    spider = cls(*args, **kwargs)
  File "/home/ubuntu/scrapers/my_scraper/my_scraper/spiders/spider.py", line 27, in __init__
    self.driver = webdriver.Chrome('/usr/bin/chromedriver', chrome_options=chrome_options)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706),platform=Linux 5.4.0-1029-aws x86_64)

Обновление

Этот ответ помогает мне решить проблему (но я не совсем понимаю почему)

Я запустил echo $ PATH в моей оболочке Ubuntu и скопировал значение в crontab:

PATH=/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
05 12 * * * cd /home/ubuntu/scrapers/my_scraper && scrapy crawl my_spider >> /tmp/scraper.log 2>&1

Примечание. Поскольку я назначил вознаграждение за этот вопрос, я счастлив назначить его на любой ответ, который объясняет, почему изменение PATH решил проблему.

5
задан 15 December 2020 в 13:22

3 ответа

Это причина почти всех случаев, когда cron не запускается.

Cron всегда работает с в основном пустой средой . HOME , LOGNAME и SHELL установлены; и очень ограниченный PATH . Поэтому рекомендуется использовать полные пути к исполняемым файлам и экспортировать любые переменные, которые вам нужны в вашем скрипте при использовании cron .

Кроме того, вы можете использовать переменные среды, которые вы используете в своей оболочке .

Обратите внимание, что вы не можете использовать подстановку переменных как в оболочке, поэтому объявление типа PATH = / usr / local / bin: $ PATH интерпретируется буквально.

8
ответ дан 4 January 2021 в 08:18

Вы также можете попробовать это. Crontab открывает новую оболочку для пользователя ubuntu.

05 12 * * *   su - ubuntu -c 'cd /home/ubuntu/scrapers/my_scraper && scrapy crawl my_spider >> /tmp/scraper.log 2>&1'
1
ответ дан 4 January 2021 в 08:18

Команды readlink , dirname и cat не удалось найти, потому что / bin не включен в переменную среды PATH .

Объясните

неизвестную ошибку: сбой Chrome для начала: вышел ненормально Процесс, запущенный из местоположения chrome / usr / bin / google-chrome, больше не выполняется, поэтому ChromeDriver предполагает, что Chrome разбился.

Попробуйте установить PATH = / usr / local / bin: / home / ubuntu /.local/bin/ и выполните / usr / bin / google-chrome --no-sandbox --headless --disable-dev-shm-usage вы получите

/usr/bin/google-chrome: line 8: readlink: command not found
/usr/bin/google-chrome: line 10: dirname: command not found
/usr/bin/google-chrome: line 45: exec: cat: not found
/usr/bin/google-chrome: line 46: exec: cat: not found
1
ответ дан 4 January 2021 в 08:18

Другие вопросы по тегам:

Похожие вопросы: