gpt4 book ai didi

javascript - 解决缓慢的 headless 浏览器渲染 html、javascript 到 python 中的屏幕截图图像的解决方案?

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:22 26 4
gpt4 key购买 nike

我用 flask 构建了一个 API,它使用 chrome headless司机和selenium在 python 中呈现包含带有一些 javascript 的简单 html 页面的给定地址,并拍摄呈现页面的快照。部署到服务器后,请求花费的时间太长,因为 headless 浏览器必须执行每个缓慢的请求。

是否有更快的方法来使用 headless 浏览器或可以获取请求的 html、javascript 并像 python 中的浏览器一样呈现它以获取屏幕截图的替代方法?

def create_screenshot(id):

options = Options()

options.add_argument('--headless')
options.add_argument('--disable-gpu') # Last I checked this was necessary.
options.add_argument('--ignore-certificate-errors')
options.add_argument('--no-sandbox')
options.add_argument("--window-size=1920,1920")

driver = webdriver.Chrome('./chromedriver', chrome_options=options,
service_args=['--verbose', '--log-path=/tmp/chromedriver.log'])
driver.get("http://127.0.0.1:1234/snippet/{0}".format(id))

driver.maximize_window()

element = driver.find_element_by_id("snapArea")
location = element.location
size = element.size
x = location['x']
y = location['y']
width = location['x']+size['width']
height = location['y']+size['height']
png = driver.get_screenshot_as_png()

im = Image.open(BytesIO(png))
im = im.crop((int(x), int(y), int(width), int(height)))

path = create_folder(id)
im.save(path)
return path

最佳答案

与其每次都初始化驱动程序,不如在开始时在类中创建它(即,作为一个名为“self.driver”的属性),然后在需要时调用它?像这样:

class DriverContainer:
def __init__(self):
options = Options()

options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--no-sandbox')
options.add_argument("--window-size=1920,1920")

self.driver = webdriver.Chrome('./chromedriver', chrome_options=options,
service_args=['--verbose', '--log-path=/tmp/chromedriver.log'])

def take_screenshot(self, id):
self.driver.get("http://127.0.0.1:1234/snippet/{0}".format(id))

self.driver.maximize_window()
element = self.driver.find_element_by_id("snapArea")
location = element.location
size = element.size
x = location['x']
y = location['y']
width = location['x']+size['width']
height = location['y']+size['height']
png = self.driver.get_screenshot_as_png()

im = Image.open(BytesIO(png))
im = im.crop((int(x), int(y), int(width), int(height)))

path = create_folder(id)
im.save(path)

然后使用 driver_container = DriverContainer() 实例化它,并在需要时执行 driver_container.take_screenshot(id)。这样浏览器将跳过缓慢的启动,根据我的经验,这是 selenium 最慢的地方。

关于javascript - 解决缓慢的 headless 浏览器渲染 html、javascript 到 python 中的屏幕截图图像的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52698552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com