Selenium - 解析页面需要太长时间

时间:2015-07-12 16:15:26

标签: python parsing selenium selenium-webdriver html-parsing

我在Python 2.7中使用Selenium。我得到了加载页面和类似的东西比原始请求花费更长的时间,因为它模拟包括JS等在内的所有内容。

我不明白的是解析已经加载的页面需要太长时间。

每次加载页面时,我发现所有标签都满足某些条件(约30个div标签),然后我将每个标签作为属性放入解析功能。为了解析我使用css_selectors和类似的方法,如:on.find_element_by_css_selector("div.carrier p").text

据我了解,当加载页面时,此页面的源代码会保存在我的RAM或其他任何地方,因此解析应该在几毫秒内完成。

编辑:我敢打赌,使用BeautifulSoup解析相同的源代码会快10倍以上,但我不明白为什么。

你有任何解释吗?感谢

1 个答案:

答案 0 :(得分:2)

这些是用于不同目的的不同工具Selenium是一个浏览器自动化工具,具有丰富的技术来定位元素。 BeautifulSoup是一个HTML解析器。当您找到具有Selenium的元素时 - 这不是HTML解析。换句话说,driver.find_element_by_id("myid")soup.find(id="myid")是完全不同的东西。

当您要求selenium使用find_element_by_css_selector()查找元素时,HTTP request会向/session/$sessionId/element端点发送JSON wire protocol。然后,如果一切都没有错误,你的selenium python客户端会收到一个响应并返回一个WebElement实例。你可以把它想象成一个实时/动态的东西,你得到一个真实的Web元素,它在浏览器中“生活”,你可以控制它并与之交互。

使用BeautifulSoup,一旦下载页面源,就不再有网络组件,没有与页面和元素的实时交互,只涉及HTML解析。

实际上,如果你正在进行网络抓取,并且你需要一个真正的浏览器来执行javascript并处理AJAX,并且你之后正在进行复杂的HTML解析,那么获得所需的.page_source和将其提供给BeautifulSoup,或者在速度方面更好 - lxml.html

请注意,在这种情况下,通常不需要页面的完整HTML源代码。为了使HTML解析更快,您可以将包含所需数据的页面块的“内部”或“外部”HTML提供给所选的html解析器。例如:

container = driver.find_element_by_id("container").getAttribute("outerHTML")
driver.close()

soup = BeautifulSoup(container, "lxml")