【发布时间】:2016-09-29 14:33:09
【问题描述】:
我正在尝试将页面的所有可见内容捕获为文本。以that 为例。
如果我存储页面源代码,则不会捕获 cmets 部分,因为它是使用 javascript 加载的。
有没有办法使用 selenium webdriver 拍摄 HTML 快照? (最好使用python包装器表示)
【问题讨论】:
标签: python selenium-webdriver web-crawler
我正在尝试将页面的所有可见内容捕获为文本。以that 为例。
如果我存储页面源代码,则不会捕获 cmets 部分,因为它是使用 javascript 加载的。
有没有办法使用 selenium webdriver 拍摄 HTML 快照? (最好使用python包装器表示)
【问题讨论】:
标签: python selenium-webdriver web-crawler
无论页面的 HTML 是否使用 JavaScript 生成,您仍然可以使用 driver.page_source 捕获它。
我想您无法在示例中捕获 cmets 部分的来源的原因是因为它包含在 iframe 中 - 为了捕获框架/iframe 中内容的 html 源,您需要首先将焦点切换到该特定帧,然后调用driver.page_source。
【讨论】:
此代码将截取整个页面:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://dukescript.com/best/practices/2015/11/23/dynamic-templates.html')
driver.save_screenshot('screenshot.png')
driver.quit()
但是,如果您只想要特定元素的屏幕截图,则可以使用:
def get_element_screenshot(element: WebElement) -> bytes:
driver = element._parent
ActionChains(driver).move_to_element(element).perform() # focus
src_base64 = driver.get_screenshot_as_base64()
scr_png = b64decode(src_base64)
scr_img = Image(blob=scr_png)
x = element.location["x"]
y = element.location["y"]
w = element.size["width"]
h = element.size["height"]
scr_img.crop(
left=math.floor(x),
top=math.floor(y),
width=math.ceil(w),
height=math.ceil(h))
return scr_img.make_blob()
其中 WebElement 是您正在追逐的元素。当然,这种方法需要你导入from base64 import b64decode和from wand.image import Image来处理裁剪。
【讨论】: