¿Es lento el selenium, o mi código es incorrecto?

Así que estoy intentando iniciar sesión en Quora usando Python y luego raspar algunas cosas.

Estoy usando Selenium para iniciar sesión en el sitio. Aquí está mi código:

from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get('http://www.quora.com/') username = driver.find_element_by_name('email') password = driver.find_element_by_name('password') username.send_keys('email') password.send_keys('password') password.send_keys(Keys.RETURN) driver.close() 

Ahora las preguntas:

  1. Le tomó ~ 4 minutos encontrar y completar el formulario de inicio de sesión, lo que es muy lento. ¿Hay algo que pueda hacer para acelerar el proceso?

  2. Cuando se conectó, ¿cómo me aseguro de que no haya errores? En otras palabras, ¿cómo verifico el código de respuesta?

    • ¿Cómo guardo las cookies con selenium para poder continuar raspando una vez que inicie sesión?

    • Si no hay manera de hacer que el selenium sea más rápido, ¿hay alguna otra alternativa para iniciar sesión? (Quora no tiene una API)

    Tuve un problema similar con las llamadas a find_elements_xxx muy lentas en Python Selenium usando el ChromeDriver. Finalmente, localicé el problema en una llamada al conductor.implícitamente_guardar () que hice antes de mis llamadas a find_element_xxx (); cuando lo saqué, mis llamadas find_element_xxx () se ejecutaron rápidamente.

    Ahora, sé que esos elementos estaban allí cuando hice las llamadas a find_elements_xxx (). Así que no puedo imaginar por qué implícito_wait debería haber afectado la velocidad de esas operaciones, pero lo hizo.

    1. He estado allí, el selenium es lento. Puede que no sea tan lento como 4 minutos para llenar un formulario. Entonces comencé a usar phantomjs, que es mucho más rápido que Firefox, ya que no tiene cabeza. Simplemente puede reemplazar Firefox () con PhantomJS () en la línea del controlador web después de instalar los últimos phantomjs.

    2. Para comprobar que ha iniciado sesión, puede hacer valer un elemento que se muestra después de iniciar sesión.

    3. Mientras no salga del controlador, las cookies estarán disponibles para seguir los enlaces.

    4. Puede intentar usar urllib y publicar directamente en el enlace de inicio de sesión. Puedes usar cookiejar para guardar cookies. Incluso puede simplemente guardar una cookie, después de todo, una cookie es simplemente una cadena en el encabezado http

    Puede ajustar su relleno de formularios usando su propio método setAttribute, aquí está el código para Java para ello

     public void setAttribute(By locator, String attribute, String value) { ((JavascriptExecutor) getDriver()).executeScript("arguments[0].setAttribute('" + attribute + "',arguments[1]);", getElement(locator), value); } 

    Para Windows 7 e IEDRIVER con Python Selenium, terminar la línea de comandos de Windows y reiniciarla solucionó mi problema.

    Estaba teniendo problemas con find_element..clicks. Estaban tomando 30 segundos más un poco. Aquí está el tipo de código que tengo, incluyendo la captura del tiempo de ejecución.

     timeStamp = time.time() elem = driver.find_element_by_css_selector(clickDown).click() print("1 took:",time.time() - timeStamp) timeStamp = time.time() elem = driver.find_element_by_id("cSelect32").click() print("2 took:",time.time() - timeStamp) 

    Eso fue la grabación de unos 31 segundos por cada clic. Después de finalizar la línea de comandos y reiniciarla (lo que finaliza cualquier proceso IEDRIVERSERVER.exe), fue de 1 segundo por clic.

    Ejecutar el controlador web sin cabeza debería mejorar su velocidad de ejecución hasta cierto punto.

     from selenium.webdriver import Firefox from selenium.webdriver.firefox.options import Options options = Options() options.add_argument('-headless') browser = webdriver.Firefox(firefox_options=options) browser.get('https://google.com/') browser.close() 

    He cambiado de localizadores y esto funciona rápido. Además, he añadido trabajar con cookies. Compruebe el código a continuación:

     from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.keys import Keys import pickle driver = webdriver.Firefox() driver.get('http://www.quora.com/') wait = WebDriverWait(driver, 5) username = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="email"]'))) password = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="password"]'))) username.send_keys('email') password.send_keys('password') password.send_keys(Keys.RETURN) wait.until(EC.presence_of_element_located((By.XPATH, '//span[text()="Add Question"]'))) # checking that user logged in pickle.dump( driver.get_cookies() , open("cookies.pkl","wb")) # saving cookies driver.close() 

    Hemos guardado las cookies y ahora las aplicaremos en un nuevo navegador:

     driver = webdriver.Firefox() driver.get('http://www.quora.com/') cookies = pickle.load(open("cookies.pkl", "rb")) for cookie in cookies: driver.add_cookie(cookie) driver.get('http://www.quora.com/') 

    Esperanza, esto ayudará.