2013-05-17 18 views
12

Sto imparando a usare Python Selenium e BeautifulSoup per il web scraping. Attualmente sto cercando di analizzare le ricerche più frequenti sulle tendenze di ricerca di Google http://www.google.com/trends/hottrends#pn=p5Selenium scarica la pagina full html

Questo è il mio codice corrente. Tuttavia, ho realizzato che l'html completo non è stato scaricato e ho solo il contenuto delle ultime date più recenti. Cosa posso fare per correggere questo problema?

from selenium import webdriver 
from bs4 import BeautifulSoup 

googleURL = "http://www.google.com/trends/hottrends#pn=p5" 

browser = webdriver.Firefox() 
browser.get(googleURL) 
content = browser.page_source 

soup = BeautifulSoup(content) 
print soup 
+0

Eventuali motivi specifici per l'utilizzo di webdrivers tramite selenio per questo? – Torxed

+0

@Torxed - Sospetto che sia a causa del contenuto dinamico/gestione javascript ... – root

+0

sì ho provato urllib2 ma non ha funzionato a causa del contenuto dinamico/javascript – user2392965

risposta

5

Utenti aggiungere più contenuto alla pagina (da date precedenti) facendo clic l'elemento <div onclick="control.moreData()" id="moreLink">More...</div> in fondo alla pagina.

Quindi, per ottenere il contenuto desiderato, è possibile utilizzare Selenium per fare clic sull'elemento id="moreLink" o eseguire alcuni JavaScript per chiamare control.moreData(); in un ciclo.

Ad esempio, se si desidera ottenere tutto il contenuto fino a venerdì 15 febbraio 2013 (sembra che esista una stringa di questo formato per ogni data, per il contenuto caricato) il proprio python potrebbe essere simile al seguente:

content = browser.page_source 
desired_content_is_loaded = false; 
while (desired_content_is_loaded == false): 
    if not "Friday, February 15, 2013" in content: 
      sel.run_script("control.moreData();") 
      content = browser.page_source 
    else: 
      desired_content_is_loaded = true; 

EDIT:

Se si disattiva JavaScript nel browser e ricaricare la pagina, vedrete che non v'è alcun contenuto "tendenze" a tutti. Quello che mi dice, è che quegli elementi sono caricati dinamicamente. Significa che non fanno parte del documento HTML che viene scaricato quando apri la pagina. Selenium's .get() attende il caricamento del documento HTML, ma non per completare tutto il JS. Non si sa se il JS asincrono verrà completato prima o dopo qualsiasi altro evento. Completa quando è pronto e potrebbe essere diverso ogni volta. Ciò spiegherebbe perché a volte potresti ottenere tutti, alcuni o nessuno di questi contenuti quando chiami browser.page_source perché dipende dalla velocità con cui JS async funziona in quel momento.

Quindi, dopo aver aperto la pagina, è possibile provare ad attendere alcuni secondi prima di ottenere l'origine, fornendo il JS che carica il tempo di completamento del contenuto.

browser.get(googleURL) 
time.sleep(3) 
content = browser.page_source 
+0

grazie per la risposta. Tuttavia, il problema è che non sto nemmeno ottenendo tutti i risultati dalla prima pagina, ad es.Ho solo tre dischi anche quando ce ne sono sei nella schermata iniziale. A proposito, c'è un modo per automatizzare lo scroll down invece di codificare hard la data di venerdì 15 febbraio 2013? Grazie. – user2392965

+1

invece di time.sleep guarderei in selenium.webdriver.support.ui.WebDriverWait http://stackoverflow.com/questions/9823272/python-selenium-waiting-for-frame-element-lookups – qwwqwwq

+0

Ho modificato la mia risposta a spiega perché potresti ottenere solo alcuni risultati quando ce ne sono altri sullo schermo. –

Problemi correlati