2013-05-17 12 views
12

Uczę się używać Pythona Selenium i BeautifulSoup do skrobania w Internecie. Obecnie próbuję zeskrobać gorące wyszukiwania w wyszukiwarkach Google http://www.google.com/trends/hottrends#pn=p5Selenium pobierz pełną stronę html

To jest mój obecny kod. Zdałem sobie jednak sprawę, że cały plik HTML nie jest pobierany i mam tylko zawartość z ostatnich kilku dat. Co mogę zrobić, aby rozwiązać ten problem?

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

Jakieś konkretne powody, dla których warto używać webloverów przez selen? – Torxed

+0

@ Torxed - podejrzewam, że jest to spowodowane dynamiczną obsługą treści/javascript ... – root

+0

Tak, próbowałem urllib2, ale nie działało ze względu na zawartość dynamiczną/javascript – user2392965

Odpowiedz

5

Użytkownicy dodać więcej treści do strony (z wcześniejszych terminach), klikając element <div onclick="control.moreData()" id="moreLink">More...</div> w dolnej części strony.

Aby uzyskać pożądaną zawartość, można użyć Selenium, aby kliknąć element id="moreLink" lub wykonać trochę kodu JavaScript, aby wywołać control.moreData(); w pętli.

Na przykład, jeśli chcesz, aby cała zawartość była już w piątek, 15 lutego 2013 r. (Wygląda na to, że istnieje ciąg tego formatu dla każdej daty, dla załadowanej zawartości), twój python może wyglądać mniej więcej tak:

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:

Jeśli wyłączysz obsługę JavaScript w przeglądarce i odświeżyć stronę, widać, że nie ma „trendy” zawartość w ogóle. To, co mi mówi, to fakt, że te elementy są ładowane dynamicznie. Oznacza to, że nie są częścią dokumentu HTML, który jest pobierany po otwarciu strony. Selenium .get() czeka na załadowanie dokumentu HTML, ale nie dla wszystkich JS. Nie wiadomo, czy JS asynchronizacji zakończy się przed lub po jakimkolwiek innym zdarzeniu. Kończy się, gdy jest gotowy i za każdym razem może być inny. To by wyjaśniało, dlaczego czasami możesz uzyskać wszystkie, niektóre lub żadne z tych treści, gdy zadzwonisz pod numer browser.page_source, ponieważ zależy to od tego, jak szybko działa asynchroniczny JS w tym momencie.

Po otwarciu strony możesz spróbować poczekać kilka sekund przed uzyskaniem źródła - dając JS, który ładuje czas zawartości do ukończenia.

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

dzięki za odpowiedź. Problem polega jednak na tym, że nie otrzymuję nawet wszystkich wyników z pierwszej strony, np.Dostaję tylko trzy rekordy, nawet jeśli na ekranie początkowym jest ich sześć. Btw, czy istnieje sposób na zautomatyzowanie przewijania w dół zamiast twardego kodowania daty w piątek, 15 lutego 2013 r.? Dzięki. – user2392965

+1

zamiast time.sleep zajrzałabym do selenium.webdriver.support.ui.WebDriverWait http://stackoverflow.com/questions/9823272/python-selenium-waiting-for-frame-element-lookups – qwwqwwq

+0

Edytowałem moją odpowiedź na wyjaśnij, dlaczego możesz uzyskać tylko niektóre wyniki, gdy na ekranie jest ich więcej. –

Powiązane problemy