Selenium 下载完整的 html 页面
Posted
技术标签:
【中文标题】Selenium 下载完整的 html 页面【英文标题】:Selenium download full html page 【发布时间】:2013-05-12 08:00:34 【问题描述】:我正在学习使用 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 -- 我怀疑这是因为动态内容/javascript处理...... 是的,我尝试了 urllib2,但由于动态内容/javascript,它不起作用 @Torxed -- 好吧,OP 确实链接了实际页面。 @Torxed 我对 *** 很陌生,我没有给你投反对票 【参考方案1】:用户通过单击页面底部的<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 日星期五的日期?谢谢。 而不是 time.sleep 我会查看 selenium.webdriver.support.ui.WebDriverWait ***.com/questions/9823272/… 我编辑了我的答案以解释为什么当屏幕上有更多结果时您可能只会得到一些结果。 但是如何下载(和保存)这些数据?当我尝试写为 ascii 文件时出现错误 u'\xae' file io 是另一个主题,但在 python 中它非常简单。这家伙的回答简洁明了,举个简单的例子:***.com/a/30021479/2386700以上是关于Selenium 下载完整的 html 页面的主要内容,如果未能解决你的问题,请参考以下文章