Yo uso selenio y bs4 para analizar la página web. Y la página web utiliza escanear código qr y código de verificación para iniciar sesión.

Uso WebDriverWait para esperar que el usuario inicie sesión con

wait = ui.WebDriverWait(driver, 60)         # timeout after 60 seconds, just leave time for user to login

wait.until(lambda driver: driver.execute_script('return isLogin();'))

Y después de iniciar sesión, luego comenzaré el trabajo de análisis.

Funciona bien, excepto que cada vez que ejecuto el script, se abre una nueva ventana broswr y necesito iniciar sesión.

Cómo conservar el estado de inicio de sesión para evitar el inicio de sesión cada vez que se ejecuta el script.

2
Kris Roofe 30 oct. 2019 a las 10:44

3 respuestas

La mejor respuesta

Para evitar iniciar sesión cada vez que pueda usar cookies. Por ejemplo:

import pickle

from selenium import webdriver 


browser = webdriver.Chrome()
browser.get("http://www.google.com")
pickle.dump(browser.get_cookies(), open("cookies.pkl","wb"))

Y descargue las cookies más tarde:

import pickle

from selenium import webdriver


browser = webdriver.Chrome()
browser.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    browser.add_cookie(cookie)
1
Random1k11 30 oct. 2019 a las 07:56

Puede usar un perfil predeterminado de un navegador

options = webdriver.ChromeOptions() 
options.add_argument("user-data-dir=C:\\Path") #Path to your chrome profile
w = webdriver.Chrome(executable_path="C:\\Users\\chromedriver.exe", chrome_options=options)

Puede encontrar una ruta de perfil poniendo chrome://version/ en la URL del navegador.

1
Darshan Patel 30 oct. 2019 a las 07:58

He encontrado a continuación dos soluciones.

1. use el perfil de Broser ( Esto no se aplica al sitio, solicite inicio de sesión cuando abra una nueva ventana )

Yo uso Firefox, así que configuro el perfil de esta manera.

profile = webdriver.FirefoxProfile('C:/Users/lf/AppData/Roaming/Mozilla/Firefox/Profiles/5fvhqsc9.selenium')
driver = webdriver.Firefox(firefox_profile=profile)

Si desea establecer un perfil separado para su código, use firefox.exe -p en la línea cmd. Consulte firefox-profile-selenium-webdriver
Nota , solo use el perfil en su código, no cambie el perfil de selección predeterminado.

2. use cookie ( Esto aplica al sitio solicita inicio de sesión cuando abre una nueva ventana )

from selenium import webdriver
from selenium.webdriver.support import ui
import pickle

driver = webdriver.Firefox()
"""
    Cookie can be only add to the request with same domain.
    When webdriver init, it's request url is `data:` so you cannot add cookie to it.
    So first make a request to your url then add cookie, then request you url again.
"""
browser = driver.get('url')

cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)

browser = driver.get('url')

if driver.execute_script('return !isLogin();'):       #[How to access javascript result in selenium](https://stackoverflow.com/q/58620192/6521116)
    driver.execute_script('openLoginUI();')    
    # [How can I make Selenium/Python wait for the user to login before continuing to run?](https://stackoverflow.com/a/16927552/6521116)
    wait = ui.WebDriverWait(driver, 60)         # timeout after 60 seconds, just leave time for user to login
    wait.until(driver.execute_script('return isLogin()'))

pickle.dump(driver.get_cookies(), open("cookies.pkl", "wb"))

Referencia:
Cómo acceder al resultado de JavaScript en selenio
¿Cómo puedo hacer que Selenium / Python espere a que el usuario inicie sesión antes de continuar con la ejecución?
org.openqa.selenium.InvalidCookieDomainException: el documento es adverso a las cookies con Selenium y WebDriver

0
Kris Roofe 30 oct. 2019 a las 12:01