jerwright
@jerwright
while True: coding()

Почему не получается использовать selenium с Heroku?

Недавно столкнулся с проблемой. Создал парсер на selenium и bs4. Мне нужно было, чтобы через selenium бот смог нажать на кнопку "Загрузить ещё". У меня на компьютере код отрабатывается отлично, но в случае с Heroku выдаёт ошибки.

Ссылка на страницу: https://vstup.osvita.ua/y2021/r5/111/848151/

Ошибки:
1) Эта ошибка появляется при включении программы Heroku. 2021-07-21T06:24:27.787246+00:00 app[worker.1]: /app/.heroku/python/lib/python3.9/site-packages/selenium/webdriver/firefox/firefox_profile.py:208: SyntaxWarning: "is" with a literal. Did you mean "=="?
2021-07-21T06:24:27.787261+00:00 app[worker.1]: if setting is None or setting is '':

2) Эта ошибка появляется после выполнения команды.
2021-07-21T06:31:42.821687+00:00 app[worker.1]: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[7]/div/div/div[3]/span"}
2021-07-21T06:31:42.821695+00:00 app[worker.1]: (Session info: headless chrome=91.0.4472.164)

Код:
def do_abitcheck(message, fio, URL=None):
    chrome_options = webdriver.ChromeOptions()
    chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN")
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--proxy-server=138.128.91.65:8000")
    driver = webdriver.Chrome(executable_path=os.environ.get("CHROMEDRIVER_PATH"), options=chrome_options)

    try:
        driver.get(url=URL)
        time.sleep(2)
        driver.refresh()
        time.sleep(3)
        more_button = driver.find_element_by_xpath('/html/body/div[7]/div/div/div[3]/span')
        more_button.click()
        time.sleep(1)
    except UnexpectedAlertPresentException as ex:
        return bot.send_message(message.chat.id, "Виникла помилка під час підключення до сайту через постійних спроб зі сторони боту. Зачекайте, будь ласка, та спробуйте ще раз.")
    except Exception as ex:
        print(ex)
        return bot.send_message(message.chat.id, 'Виникла помилка під час підключення до сайту. Можливо, сторінка не була знайдена. Спробуйте ще раз та перевірте посилання.')
    finally:
        time.sleep(4)
        needed_html_code = driver.page_source
        driver.close()
        driver.quit()


Ошибки возникают из-за неудачной попытки нажать на кнопку, но на локальном компьютере они не возникают.

Переменная needed_html_code отвечает за копирование htmk кода страницы после того, как появляются другие колонки на сайте за счёт нажатия на кнопку.

Что можно изменить в данной ситуации или же можно как-то заставить бота нажать на кнопку сайта через beautifulsoup4 или requests и скопировать появившиеся колонки?
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Во-первых, не стоит использовать проверку на идентичность там, где нужна проверка на эквивалентность. Во-вторых, когда не срабатывает селектор, стоит логировать содержимое страницы. Скорее всего, сайт разрабатывал не совсем дурак, поэтому на нём есть защита от парсеров, возвращающая страницу-заглушку на запрос с Heroku.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы