15

我正在学习使用 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
4

1 回答 1

9

<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;

编辑:

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

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

browser.get(googleURL)
time.sleep(3)
content = browser.page_source
于 2013-05-17T23:13:58.897 回答