Selenium - 解析页面花费的时间太长

Selenium - parsing a page takes too long

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

我不明白的是,解析已加载页面的时间太长了。

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

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

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

你有什么解释吗?谢谢

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

当你要求 selenium 寻找一个元素时,比如说,使用 find_element_by_css_selector(),有一个 HTTP request being sent to /session/$sessionId/element endpoint by the JSON wire protocol。然后,如果一切顺利,您的 selenium python 客户端将收到响应,并且 return 您将收到一个 WebElement 实例。你可以把它想象成一个 real-time/dynamic 的东西,你在浏览器中得到一个 "living" 的真实 Web 元素,你可以控制它并与之交互。

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


在实践中,如果你在做网页抓取,你需要一个真正的浏览器来执行 javascript 和处理 AJAX,然后你正在做一个复杂的 HTML 解析,获得所需的 .page_source 并将其提供给 BeautifulSoup 是有意义的,或者,在速度方面甚至更好 - lxml.html

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

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

soup = BeautifulSoup(container, "lxml")