Как сохранить логин в Instagram между последующими запусками Selenium без головы
Tl ;dr chrome profile для сценария Selenium работает в режиме без головы каждый раз, но (иногда) дает сбой в режиме без головы.
У меня есть скрипт на Selenium python, который запускается через час и требует от меня входа в Instagram. Поскольку я развертываю это на Heroku (и insta заставляет меня часто менять свой пароль, если он обнаруживает необычные логины), мой скрипт использует браузер Chrome без головы для входа в insta один раз (переход от экрана входа к экрану ленты insta) во время при первом запуске создает профиль Chrome, а затем использует тот же профиль Chrome (с сохраненными файлами cookie и т. д.) для моих последующих запусков сеанса сценария, чтобы исключить необходимость входа в систему каждый раз. Он также повторно выполняет вход в систему при последующих запусках, если обнаруживает, что я еще не вошел в систему в качестве запасного варианта.
Мой скрипт всегда работает, когда я запускаю его локально на MacOS с headless=False
- первый запуск всегда правильно входит в систему и создает профиль chrome, который успешно используется для перехода прямо к моей ленте insta в следующих запусках. Однако, когда я запускаю его локально (или в Heroku) сheadless=True
, профиль иногда не сохраняет мой логин (и тогда мне приходится повторно входить в систему при следующих запусках). Вот параметры, которые я передаю в свой веб-драйвер:
from selenium import webdriver
import os
def get_chrome_options(self, headless=True):
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--remote-debugging-port=9222')
if headless:
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--window-size=1200x762')
chrome_options.add_argument('--user-data-dir=' + os.getcwd() + '/chrome_profile_1')
chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN")
return chrome_options
Я пытаюсь использовать user-data-dir
возможность создать профиль при необходимости (обратите внимание, что /chrome_profile_1 не существует в репозитории до первого запуска) и получить его, если он уже присутствует.
Я проверил, что во всех моих запусках драйвер действительно доходит до представления ленты insta к концу, поэтому это не проблема с моей логикой входа. Даже в тех случаях, когда логин не сохраняется должным образом, скрипт всегда успешно создает каталог chrome_profile. Я попытался напрямую отправить свой chrome_profile_1 в свой экземпляр Heroku, но он тоже не работает (я не думаю, что Heroku-buildpack-google-chrome совместим с профилем, созданным моим локальным экземпляром chrome).
Я также пробовал добавить driver.close()
и немного дополнительного времени в дополнение к driver.quit()
в конце, на случай, если, возможно, неправильное закрытие браузера Chrome без головы - это то, что отличает запуск без головы от запуска без головы, но это, похоже, не решает проблему. Кроме того, я попытался добавить такие параметры, как--profile-directory=, 'disable-dev-shm-usage', --hide-scrollbars, --single-process, --ignore-certificate-errors
.
PS: Похоже, что Heroku отбрасывает созданный каталог профиля chrome между запусками (https://help.heroku.com/K1PPS2WM/why-are-my-file-uploads-missing-deleted) - как только я выяснить, как правильно создать профиль chrome, есть ли способ сохранить его между запусками на самом экземпляре Heroku, или я должен сохранить его извне, а затем вытащить его в Heroku при следующем запуске?