我在Python 2.7中使用Selenium。我得到了加载页面和类似的东西比原始请求花费更长的时间,因为它模拟包括JS等在内的所有内容。
我不明白的是解析已经加载的页面需要太长时间。
每次加载页面时,我发现所有标签都满足某些条件(约30个div标签),然后我将每个标签作为属性放入解析功能。为了解析我使用css_selectors和类似的方法,如:on.find_element_by_css_selector("div.carrier p").text
据我了解,当加载页面时,此页面的源代码会保存在我的RAM或其他任何地方,因此解析应该在几毫秒内完成。
编辑:我敢打赌,使用BeautifulSoup解析相同的源代码会快10倍以上,但我不明白为什么。
你有任何解释吗?感谢
答案 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")