用python将html、javascript呈现到屏幕截图图像的慢速无头浏览器的解决方案?
我已经用flask构建了一个API,它使用驱动程序和python来呈现一个给定的地址,其中包含一个简单的html页面和一些javascript,并对呈现的页面进行快照。 在部署到服务器后,请求花费的时间太长,因为headless browser必须执行每一个缓慢的请求 有没有一种更快的方法来使用headless浏览器或替代品,它可以获得所请求的html、javascript,并像python中的浏览器一样呈现以获得屏幕截图用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
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类将按照收到的顺序执行它们。