我正在学习使用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
答案 0 :(得分:6)
用户可以通过点击页面底部的<div onclick="control.moreData()" id="moreLink">More...</div>
元素向页面添加更多内容(从之前的日期开始)。
为了获得所需的内容,您可以使用Selenium单击id="moreLink"
元素或执行一些JavaScript以在循环中调用control.moreData();
。
例如,如果您希望获得所有内容,可以追溯到2013年2月15日星期五(看起来每个日期都存在这种格式的字符串,对于加载的内容),您的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;
编辑:
如果您在浏览器中禁用JavaScript并重新加载页面,您将看到根本没有“趋势”内容。这告诉我的是,这些项是动态加载的。这意味着,它们不是打开页面时下载的HTML文档的一部分。 Selenium的.get()等待加载HTML文档,但不能让所有JS完成。没有人知道异步JS是否会在任何其他事件之前或之后完成。它在准备就绪时完成,并且每次都可能不同。这可以解释为什么在调用browser.page_source
时有时可能会得到全部,部分或全部内容,因为它取决于异步JS在当时的工作速度有多快。
因此,在打开页面之后,您可能会尝试在获取源代码之前等待几秒钟 - 给JS加载内容时间以完成。
browser.get(googleURL)
time.sleep(3)
content = browser.page_source