2013-07-02 25 views
18

Sto raschiando contenuti da un sito Web usando Python. Per prima cosa ho usato BeautifulSoup e Mechanize su Python ma ho visto che il sito Web aveva un pulsante che creava contenuto tramite JavaScript, quindi ho deciso di utilizzare Selenium.Selenio contro BeautifulSoup per scraping web

Dato che posso trovare elementi e ottenere il loro contenuto utilizzando il selenio con metodi come driver.find_element_by_xpath, che motivo c'è di usare BeautifulSoup quando potrei usare Selenium per tutto?

E in questo caso particolare, ho bisogno di usare Selenium per fare clic sul pulsante JavaScript, quindi è meglio usare il selenio per analizzare o dovrei usare sia il selenio che la bella zuppa?

+0

Non ho mai usato il selenio per analizzare l'HTML prima, ma BeautifulSoup è piuttosto robusto. Detto questo, dal momento che stai già utilizzando Selenium per qualcosa, perché non usarlo per entrambi finché non sai perché hai bisogno di qualcos'altro? – crowder

+0

@crowder si per il momento sto facendo tutto con il selenio, ma ho usato BS prima quindi vorrei sapere qual è il migliore. Per quanto riguarda l'analisi, penso che sia un po 'lo stesso, ad esempio, con Selenium abbiamo driver.find_elements_by_class_name ("...") e con BS abbiamo soup.findAll (' ... ', {' class ' : '....'}). Ho visto che BS è un po 'lento, cosa ne pensi? – elie

+0

@elie: è davvero quello che stai cercando di ottenere. Il selenio è stato progettato come strumento di automazione dell'interfaccia utente Web, è eccessivo se si desidera analizzare l'html. Se hai bisogno di un qualche tipo di interazione con la pagina, usa Selenium. –

risposta

32

Prima di rispondere direttamente alla tua domanda, vale la pena di dire come punto di partenza: se tutto quello che devi fare è estrarre il contenuto da pagine HTML statiche, dovresti probabilmente usare una libreria HTTP (come Requests o il built-in urllib.request) con lxml o BeautifulSoup, non selenio (anche se il selenio sarà probabilmente adeguato). I vantaggi di non utilizzare Selenium inutilmente:

  • Larghezza di banda. Usare Selenium significa recuperare tutte le risorse che verrebbero normalmente recuperate quando visiti una pagina in un browser: fogli di stile, script, immagini e così via. Questo probabilmente non è necessario.
  • Stabilità e facilità di recupero degli errori. Il selenio può essere un po 'fragile, secondo la mia esperienza - anche con PhantomJS - e creare un'architettura per uccidere un'istanza di selenio appesa e crearne una nuova è un po' più irritante che impostare una semplice logica di retry-on-exception quando si utilizza requests.
  • Potenzialmente, utilizzo della CPU e della memoria: a seconda del sito che si sta analizzando e di quanti thread spider si sta tentando di eseguire in parallelo, è ipotizzabile che la logica di layout DOM o l'esecuzione di JavaScript possano diventare piuttosto costosi.

Nota che un sito che richiede i cookies per funzione non è un motivo per uscire Selenio - è possibile creare facilmente una funzione di URL-apertura che imposta magicamente e invia biscotti con richieste HTTP utilizzando cookielib/cookiejar.

Okay, allora perché potresti prendere in considerazione l'utilizzo del selenio? Praticamente per gestire il caso in cui il contenuto che si desidera sottoporre a scansione viene aggiunto alla pagina tramite JavaScript, anziché inserito nell'HTML. Anche allora, potresti essere in grado di ottenere i dati desiderati senza scomporre i macchinari pesanti. Di solito si applica uno di questi scenari:

  • JavaScript fornito con la pagina contiene già il contenuto. Il JavaScript è solo lì per fare il template o altra manipolazione DOM che inserisce il contenuto nella pagina. In questo caso, potresti voler vedere se c'è un modo semplice per estrarre il contenuto che ti interessa direttamente dal JavaScript usando espressioni regolari.
  • Il JavaScript sta premendo un'API Web per caricare il contenuto. In questo caso, considera se puoi identificare gli URL delle API pertinenti e limitarti a colpirli tu stesso; questo può essere molto più semplice e diretto di quello che effettivamente esegue JavaScript e raschia il contenuto dalla pagina web.

Se fai decidere i tuoi meriti situazione utilizzando Selenio, utilizzarlo con il PhantomJS conducente, non, per esempio, il driver predefinito di Firefox.Lo spidering web non richiede in genere il rendering grafico della pagina, o l'uso di stranezze o caratteristiche specifiche del browser, quindi un browser headless - con la CPU e il costo di memoria inferiori e un minor numero di parti mobili in crash o sospensione - è l'ideale.