关于python:selenium下载完整的html页面

Selenium download full html page

我正在学习使用Python硒和美丽的汤刮网。目前,我正在努力搜集关于谷歌搜索趋势的热门搜索http://www.google.com/trends/hotrends pn=p5

这是我当前的代码。但是,我意识到完整的HTML没有被下载,我只有最近几天的内容。我能做些什么来纠正这个问题?

1
2
3
4
5
6
7
8
9
10
11
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


用户通过单击页面底部的More...元素向页面添加更多内容(从以前的日期开始)。

为了获得您想要的内容,您可以使用Selenium单击id="moreLink"元素,或者执行一些javascript在循环中调用control.moreData();

例如,如果您希望在2013年2月15日星期五之前获取所有内容(对于每个日期,对于已加载的内容,似乎都存在此格式的字符串),则您的Python可能如下所示:

1
2
3
4
5
6
7
8
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;

编辑:

如果在浏览器中禁用javascript并重新加载页面,您将看到根本没有"趋势"内容。这告诉我,这些项目是动态加载的。也就是说,它们不是打开页面时下载的HTML文档的一部分。selenium的.get()等待加载HTML文档,但不是等待所有JS完成。不知道AsyncJS是否会在任何其他事件之前或之后完成。它在准备好的时候就完成了,每次都可能不同。这就解释了为什么当您调用browser.page_source时,有时可能会获取全部、部分或全部内容,因为这取决于异步JS在当时的工作速度。

因此,在打开页面之后,您可以尝试在获取源代码之前等待几秒钟——让加载内容的JS有时间完成。

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