【问题标题】:Using WebDriver to take screenshots with always on process使用 WebDriver 截取屏幕截图并始终在进程中
【发布时间】:2021-04-14 08:40:30
【问题描述】:

我有一个使用 Selenium Web Driver 截取给定 URL 的服务。

它工作正常,启动一个进程 -> 截取屏幕截图 -> 关闭进程。

问题是 - 返回时间太长。

有没有办法让网络驱动程序进程保持始终在线并等待请求?

这是我的代码

class WebDriver(webdriver.Chrome):
    def __init__(self, *args, **kwargs):
        logger.info('Start WebDriver instance.')
        self.start_time = datetime.now()
        self.lock = threading.Lock()
        kwargs['chrome_options'] = self.get_chrome_options()
        super().__init__(*args, **kwargs)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        logger.info(f'Quiting Webdriver instance {id(self)}, took {datetime.now() - self.start_time}')
        self.quit()

    @staticmethod
    def get_chrome_options():
        chrome_options = ChromeOptions()
        chrome_options.headless = True
        chrome_options.add_argument('--start-maximized')
        chrome_options.add_argument("--no-sandbox")  # Bypass OS security model
        chrome_options.add_argument('--disable-dev-shm-usage')  # overcome limited resource problems
        chrome_options.add_argument("--lang=en")
        chrome_options.add_argument("--disable-infobars")  # disabling infobars
        chrome_options.add_argument("--disable-extensions")  # disabling extensions
        chrome_options.add_argument("--hide-scrollbars")
        return chrome_options

    def capture_screenshot_from_html_string(self, html_str, window_size):
        with tempfile.TemporaryDirectory() as tmpdirname:
            html_filename = tmpdirname + f'/template.html'
            with open(html_filename, 'w') as f:
                f.write(html_str)

            url = 'file://' + html_filename
            img_str = self.capture_screenshot(url, window_size)

        return img_str

    def capture_screenshot(self, url, window_size):
        self.lock.acquire()
        try:
            self.set_window_size(*window_size)
            self.get(url)
            self.maximize_window()
            self.set_page_load_timeout(PAGE_LOAD_TIMEOUT)

            img_str = self.get_screenshot_as_png()

        except Exception as exc:
            logger.error(f'Error capturing screenshot url: {url}; {exc}')
            img_str = None

        finally:
            self.lock.release()

        return img_str

【问题讨论】:

    标签: python django selenium


    【解决方案1】:

    经过一些研究,我找到了一个解决方案并将其发布,以帮助解决类似问题的其他人。

    使用py-object-pool 库。

    对象池库创建一个资源类实例池并在您的项目中使用它们。 Pool是使用python内置库Queue实现的。

    每次创建新的浏览器实例都是耗时的任务,这会使客户端等待。 如果您有一个浏览器实例并使用浏览器选项卡进行管理,那么在出现任何问题时维护和调试将变得很麻烦。 对象池将帮助您在这种情况下进行管理,因为它创建资源池并在请求时提供给每个客户端。从而将进程彼此分离,无需等待或当场创建新实例。

    代码示例

    
    ff_browser_pool = ObjectPool(FirefoxBrowser, min_init=2)
    
    with ff_browser_pool.get() as (browser, browser_stats):
        title = browser.get_page_title('https://www.google.co.in/')
    

    欲了解更多信息,请参阅下面的链接 https://pypi.org/project/py-object-pool/

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      相关资源
      最近更新 更多