Настройка работы 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.