Как сохранить логин Instagram между последующими запусками безголового Selenium

#selenium #heroku #cookies #google-chrome-headless #chrome-profile

#селен #heroku #файлы cookie #google-chrome-без головы #chrome-профиль

Вопрос:

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 при следующем запуске?