Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python将html、javascript呈现到屏幕截图图像的慢速无头浏览器的解决方案?_Javascript_Python_Python 3.x_Selenium_Google Chrome Headless - Fatal编程技术网

用python将html、javascript呈现到屏幕截图图像的慢速无头浏览器的解决方案?

用python将html、javascript呈现到屏幕截图图像的慢速无头浏览器的解决方案?,javascript,python,python-3.x,selenium,google-chrome-headless,Javascript,Python,Python 3.x,Selenium,Google Chrome Headless,我已经用flask构建了一个API,它使用驱动程序和python来呈现一个给定的地址,其中包含一个简单的html页面和一些javascript,并对呈现的页面进行快照。 在部署到服务器后,请求花费的时间太长,因为headless browser必须执行每一个缓慢的请求 有没有一种更快的方法来使用headless浏览器或替代品,它可以获得所请求的html、javascript,并像python中的浏览器一样呈现以获得屏幕截图 def create_screenshot(id): options

我已经用flask构建了一个API,它使用驱动程序和python来呈现一个给定的地址,其中包含一个简单的html页面和一些javascript,并对呈现的页面进行快照。 在部署到服务器后,请求花费的时间太长,因为headless browser必须执行每一个缓慢的请求

有没有一种更快的方法来使用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\u container=DriverContainer()
实例化它,只需执行
driver\u container即可。需要时拍摄屏幕截图(id)
。这样,浏览器将跳过启动缓慢的过程,这是我的经验中selenium最慢的部分。

与其每次都初始化驱动程序,为什么不在启动时在类中创建它(即,作为名为“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\u container=DriverContainer()
实例化它,只需执行
driver\u container即可。需要时拍摄屏幕截图(id)
。这样,浏览器将在启动缓慢时跳过,根据我的经验,selenium最慢的是什么。

如果发出多个截图请求,会发生什么情况?@Farzan类将按照收到的顺序执行它们。如果发出多个截图请求,会发生什么情况?@Farzan类将按照收到的顺序执行它们。