2013-07-04 11 views
8

Quindi sto provando ad accedere a Quora usando Python e poi raschiare qualcosa.Il selenio è lento o il mio codice è sbagliato?

Sto usando Selenium per accedere al sito. Qui è il mio codice:

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() 

Ora le domande:

  1. Ci sono voluti ~ 4 minuti per trovare e riempire il form di login, che dolorosamente lenti. C'è qualcosa che posso fare per accelerare il processo?

  2. Al momento dell'accesso, come faccio a verificare che non vi siano errori? In altre parole, come posso controllare il codice di risposta?

  3. Come faccio a salvare i cookie con selenio in modo da poter continuare a fare scraping una volta effettuato l'accesso?

  4. Se non c'è modo di rendere il selenio più veloce, c'è qualche altra alternativa per l'accesso? (Quora non ha un'API)

+1

Quali linee stanno prendendo il tempo? –

+0

@vincebowdren Quasi tutti loro. Il browser si apre bene, ma poi trovare i campi e riempirli richiede circa un minuto ciascuno. –

+0

@ user1177636 Sì. Funziona bene su Google. Deve essere un problema con quora. –

risposta

3
  1. Ci sono stato, il selenio è lento. Potrebbe non essere lento come 4 minuti per riempire un modulo. Ho quindi iniziato a utilizzare phantomjs, che è molto più veloce di Firefox, poiché non ha headless. Puoi semplicemente sostituire Firefox() con PhantomJS() nella linea del webdriver dopo aver installato gli ultimi phantomjs.

  2. Per verificare di avere accesso, è possibile confermare per alcuni elementi che vengono visualizzati dopo il login.

  3. Finché non si chiudano il driver, biscotti saranno disponibili per seguire i link

  4. Puoi provare a utilizzare urllib e inviare direttamente al link di accesso. È possibile utilizzare cookiejar per salvare i cookie. Si può anche semplicemente salvare biscotto, dopo tutto, un cookie è semplicemente una stringa di intestazione http

+0

1. PhantomJS è molto più veloce di sicuro (ho impiegato ancora 38 secondi). Ma voglio essere in grado di vedere ciò che lo script sta facendo nel browser prima di passare al browser headless. 2. 'asserire" Home "in driver.title' mi ha dato' AssertionError'. 4. Posso provarlo di sicuro. –

+0

Installa l'ultima versione di phantomjs disponibile tramite il loro sito Web, non apt-get. la versione dovrebbe essere 1.9.1 – manish

+0

Sì, è quello che ho fatto. Scaricato l'ultimo dal loro sito Web, lo ha inserito nella stessa cartella del mio programma e ha ricevuto questo errore. Il file che ho scaricato era 'phantonjs' (senza estensione) –

1

partire firefox con disattivato JavaScript aiuterà:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

firefox_profile = webdriver.FirefoxProfile() 
firefox_profile.set_preference("browser.download.folderList",2) 
firefox_profile.set_preference("javascript.enabled", False) 

driver = webdriver.Firefox(firefox_profile=firefox_profile) 
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() 
+0

Sì. Questo è stato. Ma ora Quora ha restituito un errore di 500. A cosa potrebbe essere dovuto? –

+0

Circolo vizioso qui: quora non può accedere senza js acceso. Puoi provare a utilizzare il selenio con un browser diverso, ad es. cromo? – alecxe

+0

Sì. L'email è stata compilata in pochissimo tempo, ma la password ha richiesto 2 minuti. –

0

È possibile allacciare la compilazione moduli utilizzando il proprio metodo setAttribute, qui è il codice per Java per esso

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

Puoi spiegare cosa fa e come rende lo script più veloce? –

+0

Puoi semplicemente eseguire setAttribute (FindBy ***** (il tuo localizzatore qui), "valore", "Testo che vuoi mettere nel campo), e imposterà l'attributo HTML" valore "al testo che vuoi riempire il campo, in pratica c'è un timeout sull'operazione send_keys, il mio metodo lo ignora facendo in JS-injection nella tua pagina per assegnare il tuo testo al campo, questo sarebbe molto veloce – Stormy

6

ho avuto un problema simile con chiamate find_elements_xxx molto lenti in Python utilizzando il selenio ChromeDriver. Alla fine ho rintracciato il problema a una chiamata driver.implicitly_wait() che ho fatto prima delle mie chiamate find_element_xxx(); quando l'ho estratto, le mie chiamate find_element_xxx() sono state eseguite rapidamente.

Ora, I so questi elementi erano presenti quando ho effettuato le chiamate find_elements_xxx(). Quindi non riesco a immaginare perché implicit_wait debba aver influito sulla velocità di quelle operazioni, ma è così.

+0

Questo mi ha davvero aiutato passato al metodo WebDriverWait e completamente dimenticato di questa chiamata. Grazie! – rak007

Problemi correlati