Настройка работы selenium на vps сервере

Имею следующие вводные:

  • vps сервер работающий на ubuntu
  • через команду sudo apt-get install установил firefox для работы с Seleniun
  • через команду pip install Selenium установил Seleniun
  • на официальном github профиле firefox скачал geckodriver и поместил его в папку с проектом

Проблема:

При попытке запустить скрипт получаю следующую ошибку:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/common/service.py", line 76, in start
    stdin=PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: '/home/foochecker/geckodriver': '/home/foochecker/geckodriver'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/foochecker/foochecker.py", line 16, in <module>
    driver = webdriver.Firefox(executable_path='/home/foochecker/geckodriver')
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 164, in __init__
    self.service.start()
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/common/service.py", line 83, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.

Полный код python скрипта:

 from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import requests
from fake_useragent import UserAgent
import simplejson as json
import pymysql
import re

connection = pymysql.connect()
cursor = connection.cursor()
cursor.execute("SET SESSION wait_timeout=28800")

options = Options()
options.headless = True
driver = webdriver.Firefox(executable_path='/home/foochecker/geckodriver')
driver = webdriver.Firefox(options=options)
driver.get("https://docs.google.com/spreadsheets/d/e/2PACX-1vR30F8lYP3jG7YOq8es0PBpJIE5yvRVZffOyaqC0GgMBN6yt0Q-NI8pxS7hd1F9dYXnowSC6zpZmW9D/pubhtml/sheet?headers=false&gid=0")
generated_html = driver.page_source
driver.quit()

page_html = BeautifulSoup(generated_html, "html.parser")

for i, table_item in enumerate(page_html.select("tbody tr")):

    if i >= 6 and table_item.select("td")[0].text != "Queue":

        country_name_en = requests.get("https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20200317T154238Z.c936305fc0499692.fce1f7ee1c9cc985117f77fd2e3d3ed3a2806051&text="+table_item.select("td")[0].text+"&lang=en-ru&format=plain", headers={'User-Agent': str(UserAgent().random)}).text
        country_name_ru = json.loads(country_name_en)['text'][0]
        country_cases = re.sub(",", "" ,table_item.select("td")[1].text)
        country_deaths = re.sub(",", "", table_item.select("td")[2].text)
        country_recovered = re.sub(",", "", table_item.select("td")[5].text)

        cursor.execute("SELECT * FROM `countries` WHERE `name` = %s", (country_name_ru))
        city_data = cursor.fetchone()

        if city_data != None:

            if int(city_data[2]) < int(country_cases):

                cursor.execute("UPDATE `countries` SET `confirmed` = %s WHERE `countries`.`id` = %s", (country_cases, city_data[0]))

            if int(city_data[3]) < int(country_deaths):

                cursor.execute("UPDATE `countries` SET `deaths` = %s WHERE `countries`.`id` = %s", (country_deaths, city_data[0]))

        elif city_data == None:

            country_cords = json.loads(requests.get("https://geocode-maps.yandex.ru/1.x/?geocode="+country_name_ru+"&apikey=95b6455f-8923-40d6-8070-e785394a956b&format=json&lang=ru_RU", headers={'User-Agent': str(UserAgent().random)}).text)
            country_cords = country_cords['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']

            cursor.execute("INSERT INTO `countries` (`id`, `name`, `confirmed`, `deaths`, `cords`) VALUES (NULL, %s, %s, %s, %s)", (country_name_ru, country_cases, country_deaths, country_cords))

    elif table_item.select("td")[0].text == "Queue":
        break

for i, table_item in enumerate(page_html.select("tbody tr")):

    if table_item.select("td")[0].text == "TOTAL":

        total_cases = re.sub(",", "" , table_item.select("td")[1].text)
        total_deaths = re.sub(",", "" , table_item.select("td")[2].text)
        total_recovered = re.sub(",", "" , table_item.select("td")[5].text)

        cursor.execute("UPDATE `total_numbers` SET `cases` = %s, `deaths` = %s, `recovered` = %s WHERE `total_numbers`.`id` = 1;", (total_cases, total_deaths, total_recovered))

connection.close()

UPD:

добавил geckodriver в path по инструкции в интернете. Теперь получаю следующую ошибку:

Traceback (most recent call last):
  File "/home/foochecker/foochecker.py", line 16, in <module>
    webdriver.Firefox('/home/foochecker/geckodriver')
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 151, in __init__
    firefox_profile = FirefoxProfile(firefox_profile)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/firefox_profile.py", line 80, in __init__
    ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock"))
  File "/usr/lib/python3.6/shutil.py", line 315, in copytree
    names = os.listdir(src)
NotADirectoryError: [Errno 20] Not a directory: '/home/foochecker/geckodriver'

UPD2:

Traceback (most recent call last):
  File "/home/foochecker/foochecker.py", line 17, in <module>
    driver = webdriver.Firefox(executable_path='/home/foochecker/geckodriver')
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
    keep_alive=True)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: invalid argument: can't kill an exited process

UPD3:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/common/service.py", line 76, in start
    stdin=PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
PermissionError: [Errno 13] Permission denied: '/home/foochecker/geckodriver'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/foochecker/foochecker.py", line 16, in <module>
    driver = webdriver.Firefox(executable_path='/home/foochecker/geckodriver')
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 164, in __init__
    self.service.start()
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/common/service.py", line 88, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable may have wrong permissions.

Ответы (0 шт):