Selenium下载完整的html页面

use*_*965 14 python selenium

我正在学习使用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
Run Code Online (Sandbox Code Playgroud)

Din*_*ent 7

用户通过单击<div onclick="control.moreData()" id="moreLink">More...</div>页面底部的元素向页面添加更多内容(从以前的日期开始).

因此,要获得所需内容,可以使用Selenium单击id="moreLink"元素或执行一些JavaScript以control.moreData();循环调用.

例如,如果您希望在2013年2月15日星期五之前获取所有内容(对于每个日期,对于加载的内容,它看起来都是这种格式的字符串),您的python可能如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您在浏览器中禁用JavaScript并重新加载页面,您将看到根本没有"趋势"内容.这告诉我的是,这些项是动态加载的.这意味着,它们不是打开页面时下载的HTML文档的一部分.Selenium的.get()等待加载HTML文档,但不能让所有JS完成.没有人知道异步JS是否会在任何其他事件之前或之后完成.它在准备就绪时完成,并且每次都可能不同.这可以解释为什么在调用时有时可能会得到所有内容,部分内容或者没有内容,browser.page_source因为它取决于异步JS在那个时刻的工作速度.

因此,在打开页面之后,您可能会尝试在获取源代码之前等待几秒钟 - 给JS加载内容时间以完成.

browser.get(googleURL)
time.sleep(3)
content = browser.page_source
Run Code Online (Sandbox Code Playgroud)

  • 而不是time.sleep我会查看selenium.webdriver.support.ui.WebDriverWait http://stackoverflow.com/questions/9823272/python-selenium-waiting-for-frame-element-lookups (2认同)