Selenium скачать полную html-страницу

Я изучаю использование Python Selenium и BeautifulSoup для веб-соскабливания. В настоящее время я пытаюсь очистить горячие поиски в тенденциях поиска Google http://www.google.com/trends/hottrends#pn=p5

Это мой текущий код. Тем не менее, я понял, что полный html не загружен, и у меня есть только контент из последних нескольких дат. Что я могу сделать, чтобы исправить эту проблему?

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

Ответ 1

Пользователи добавляют больше контента на страницу (с предыдущих дат), нажав на элемент <div onclick="control.moreData()" id="moreLink">More...</div> в нижней части страницы.

Итак, чтобы получить желаемый контент, вы можете использовать Selenium, чтобы щелкнуть элемент id="moreLink" или выполнить некоторый JavaScript для вызова control.moreData(); в цикле.

Например, если вы хотите получить весь контент еще в пятницу, 15 февраля 2013 года (похоже, что строка этого формата существует для каждой даты, для загруженного контента), ваш python может выглядеть примерно так:/p >

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:

Если вы отключите JavaScript в своем браузере и перезагрузите страницу, вы увидите, что контент "трендов" вообще отсутствует. Что мне говорит, это то, что эти элементы загружаются динамически. Значит, они не являются частью документа HTML, который загружается при открытии страницы. Selenium.get() ожидает загрузки документа HTML, но не для завершения JS. Там не сказано, будет ли async JS завершиться до или после любого другого события. Он завершается, когда он готов, и может быть разным каждый раз. Это объясняет, почему вы иногда можете получить все, некоторые или ничто из этого содержимого, когда вы вызываете browser.page_source, потому что это зависит от того, насколько быстро работает async JS в данный момент.

Итак, после открытия страницы, вы можете попробовать подождать несколько секунд, прежде чем получить источник - дать JS, который загружает время содержимого для завершения.

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