Selenium下载完整的HTML页面。

17

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

使用Selenium通过Webdrivers的具体原因是什么? - Torxed
1
@Torxed -- 嗯,楼主确实链接了实际页面。 - root
1
@Torxed 我是 StackOverflow 的新手,我没有给你点踩。 - user2392965
@root 是的,Google所有网页的源代码都充斥着大量的东西,所以我倾向于快速浏览并查看用户到目前为止尝试了什么。根据OP的说法,他还没有尝试过urllib2,并且在回答时JavaScript问题还不为人所知,尽管事实如此,人们往往会对好的答案进行负评,而在OP描述实际问题之前,你没有理由在半靠谱的问题上发布帖子。无论如何,很抱歉给您一个非决定性的答案,user2392965,祝您成功。 - Torxed
现在的网站(至少过去十年来)大多数都有各种保护措施,防止非使用实时浏览器自动化进行爬取。同时,这也是一个好时机,提醒大家“反对票不是个人攻击”。 - Darren Ringer
显示剩余3条评论
1个回答

13

用户通过点击页面底部的<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年2月15日)?谢谢。 - user2392965
4
建议使用selenium.webdriver.support.ui.WebDriverWait替代time.sleep函数,以等待页面元素加载完成。具体实现方法请参考以下链接: https://dev59.com/_GHVa4cB1Zd3GeqPqtZn - qwwqwwq
我编辑了我的答案,解释了为什么你可能只能看到一部分结果,而屏幕上实际有更多结果。 - Dingredient
但是如何下载(并保存)这些数据呢?当我尝试将其写入ASCII文件时,我遇到了u'\xae'错误。 - user391339
文件IO是一个完全不同的话题,但在Python中它非常简单。这个人的答案很好而且简洁,提供了一个基本的例子:https://dev59.com/LnA85IYBdhLWcg3wCfHm#30021479 - Dingredient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接