我正在学习使用 Python Selenium 和 BeautifulSoup 进行网页抓取。目前,我正在尝试抓取Google搜索趋势上的热门搜索http://www.google.com/trends/hottrends#pn=p5 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
用户通过单击向页面添加更多内容(之前日期的内容)<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;
EDIT:
如果您在浏览器中禁用 JavaScript 并重新加载页面,您将看到根本没有“趋势”内容。这告诉我,这些项目是动态加载的。这意味着,它们不是您打开页面时下载的 HTML 文档的一部分。 Selenium 的 .get() 会等待 HTML 文档加载,但不会等待所有 JS 完成。无法确定异步 JS 是否会在任何其他事件之前或之后完成。它在准备好后完成,并且每次都可能不同。这可以解释为什么您有时在致电时可能会收到全部、部分或没有内容browser.page_source
因为这取决于异步 JS 此时的运行速度。
因此,打开页面后,您可以尝试等待几秒钟,然后再获取源代码 - 给加载内容的 JS 有时间完成。
browser.get(googleURL)
time.sleep(3)
content = browser.page_source
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)