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.
3 respuestas
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)
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.
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
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.