Module scrapfly.browser_config

Classes

class BrowserConfig (proxy_pool: str | ProxyPool | None = None,
os: str | OperatingSystem | None = None,
session: str | None = None,
country: str | None = None,
auto_close: bool | None = None,
timeout: int | None = None,
debug: bool | None = None,
extensions: List[str] | None = None,
block_images: bool | None = None,
block_styles: bool | None = None,
block_fonts: bool | None = None,
block_media: bool | None = None,
screenshot: bool | None = None,
resolution: str | None = None,
target_url: str | None = None,
cache: bool | None = None,
blacklist: bool | None = None,
unblock: bool | None = None,
unblock_timeout: int | None = None,
browser_brand: str | None = None,
byop_proxy: str | None = None,
enable_mcp: bool | None = None,
solve_captcha: bool | None = None)
Expand source code
class BrowserConfig(BaseApiConfig):

    CLOUD_BROWSER_HOST = 'wss://browser.scrapfly.io'

    def __init__(
        self,
        proxy_pool: Optional[Union[str, ProxyPool]] = None,
        os: Optional[Union[str, OperatingSystem]] = None,
        session: Optional[str] = None,
        country: Optional[str] = None,
        auto_close: Optional[bool] = None,
        timeout: Optional[int] = None,
        debug: Optional[bool] = None,
        extensions: Optional[List[str]] = None,
        block_images: Optional[bool] = None,
        block_styles: Optional[bool] = None,
        block_fonts: Optional[bool] = None,
        block_media: Optional[bool] = None,
        screenshot: Optional[bool] = None,
        resolution: Optional[str] = None,
        target_url: Optional[str] = None,
        cache: Optional[bool] = None,
        blacklist: Optional[bool] = None,
        unblock: Optional[bool] = None,
        unblock_timeout: Optional[int] = None,
        browser_brand: Optional[str] = None,
        byop_proxy: Optional[str] = None,
        enable_mcp: Optional[bool] = None,
        solve_captcha: Optional[bool] = None,
    ):
        if timeout is not None and timeout > 1800:
            raise ValueError('timeout cannot exceed 1800 seconds (30 minutes)')

        if proxy_pool is not None and isinstance(proxy_pool, str):
            proxy_pool = ProxyPool(proxy_pool)

        if os is not None and isinstance(os, str):
            os = OperatingSystem(os)

        self.proxy_pool = proxy_pool
        self.os = os
        self.session = session
        self.country = country
        self.auto_close = auto_close
        self.timeout = timeout
        self.debug = debug
        self.extensions = extensions
        self.block_images = block_images
        self.block_styles = block_styles
        self.block_fonts = block_fonts
        self.block_media = block_media
        self.screenshot = screenshot
        self.resolution = resolution
        self.target_url = target_url
        self.cache = cache
        self.blacklist = blacklist
        self.unblock = unblock
        self.unblock_timeout = unblock_timeout
        self.browser_brand = browser_brand
        # BYOP (Bring Your Own Proxy): full proxy URL
        # Format: {protocol}://{user}:{pass}@{host}:{port}
        # Supported protocols: http, https, socks5, socks5h, socks5+udp, socks5h+udp
        # The +udp variants enable HTTP/3 (QUIC) via SOCKS5 UDP ASSOCIATE — only
        # works with proxy providers that implement RFC 1928 UDP ASSOCIATE.
        # Requires a Custom plan subscription. See:
        # https://scrapfly.io/docs/cloud-browser-api/byop
        self.byop_proxy = byop_proxy
        self.enable_mcp = enable_mcp
        # SolveCaptcha: arm Scrapium's built-in captcha detector + solver on
        # the first page attach. Turnstile, DataDome slider, reCAPTCHA,
        # GeeTest, PerimeterX hold, and puzzle captchas are handled
        # automatically. Billed per solve; failures cost nothing.
        # https://scrapfly.io/docs/cloud-browser-api/captcha-solver
        self.solve_captcha = solve_captcha

    def websocket_url(self, api_key: str, host: Optional[str] = None) -> str:
        params = {'api_key': api_key}

        if self.proxy_pool is not None:
            params['proxy_pool'] = self.proxy_pool.value if isinstance(self.proxy_pool, ProxyPool) else self.proxy_pool

        if self.os is not None:
            params['os'] = self.os.value if isinstance(self.os, OperatingSystem) else self.os

        if self.session is not None:
            params['session'] = self.session

        if self.country is not None:
            params['country'] = self.country

        if self.auto_close is not None:
            params['auto_close'] = self._bool_to_http(self.auto_close)

        if self.timeout is not None:
            params['timeout'] = self.timeout

        if self.debug is not None:
            params['debug'] = self._bool_to_http(self.debug)

        if self.extensions:
            params['extensions'] = ','.join(self.extensions)

        if self.block_images is not None:
            params['block_images'] = self._bool_to_http(self.block_images)

        if self.block_styles is not None:
            params['block_styles'] = self._bool_to_http(self.block_styles)

        if self.block_fonts is not None:
            params['block_fonts'] = self._bool_to_http(self.block_fonts)

        if self.block_media is not None:
            params['block_media'] = self._bool_to_http(self.block_media)

        if self.screenshot is not None:
            params['screenshot'] = self._bool_to_http(self.screenshot)

        if self.resolution is not None:
            params['resolution'] = self.resolution

        if self.target_url is not None:
            params['target_url'] = self.target_url

        if self.cache is not None:
            params['cache'] = self._bool_to_http(self.cache)

        if self.blacklist is not None:
            params['blacklist'] = self._bool_to_http(self.blacklist)

        if self.unblock is not None:
            params['unblock'] = self._bool_to_http(self.unblock)

        if self.unblock_timeout is not None:
            params['unblock_timeout'] = self.unblock_timeout

        if self.browser_brand is not None:
            params['browser_brand'] = self.browser_brand

        if self.byop_proxy is not None:
            params['byop_proxy'] = self.byop_proxy

        if self.enable_mcp is not None:
            params['enable_mcp'] = self._bool_to_http(self.enable_mcp)

        if self.solve_captcha is not None:
            params['solve_captcha'] = self._bool_to_http(self.solve_captcha)

        base_host = host or self.CLOUD_BROWSER_HOST
        return base_host + '?' + urlencode(params)

    def to_dict(self) -> Dict:
        return {
            'proxy_pool': self.proxy_pool.value if isinstance(self.proxy_pool, ProxyPool) else self.proxy_pool,
            'os': self.os.value if isinstance(self.os, OperatingSystem) else self.os,
            'session': self.session,
            'country': self.country,
            'auto_close': self.auto_close,
            'timeout': self.timeout,
            'debug': self.debug,
            'extensions': self.extensions,
            'block_images': self.block_images,
            'block_styles': self.block_styles,
            'block_fonts': self.block_fonts,
            'block_media': self.block_media,
            'screenshot': self.screenshot,
            'resolution': self.resolution,
            'target_url': self.target_url,
            'cache': self.cache,
            'blacklist': self.blacklist,
            'unblock': self.unblock,
            'unblock_timeout': self.unblock_timeout,
            'browser_brand': self.browser_brand,
            'byop_proxy': self.byop_proxy,
            'enable_mcp': self.enable_mcp,
            'solve_captcha': self.solve_captcha,
        }

    @staticmethod
    def from_dict(browser_config_dict: Dict) -> 'BrowserConfig':
        proxy_pool = browser_config_dict.get('proxy_pool', None)
        if proxy_pool is not None:
            proxy_pool = ProxyPool(proxy_pool)

        os = browser_config_dict.get('os', None)
        if os is not None:
            os = OperatingSystem(os)

        return BrowserConfig(
            proxy_pool=proxy_pool,
            os=os,
            session=browser_config_dict.get('session', None),
            country=browser_config_dict.get('country', None),
            auto_close=browser_config_dict.get('auto_close', None),
            timeout=browser_config_dict.get('timeout', None),
            debug=browser_config_dict.get('debug', None),
            extensions=browser_config_dict.get('extensions', None),
            block_images=browser_config_dict.get('block_images', None),
            block_styles=browser_config_dict.get('block_styles', None),
            block_fonts=browser_config_dict.get('block_fonts', None),
            block_media=browser_config_dict.get('block_media', None),
            screenshot=browser_config_dict.get('screenshot', None),
            resolution=browser_config_dict.get('resolution', None),
            target_url=browser_config_dict.get('target_url', None),
            cache=browser_config_dict.get('cache', None),
            blacklist=browser_config_dict.get('blacklist', None),
            unblock=browser_config_dict.get('unblock', None),
            unblock_timeout=browser_config_dict.get('unblock_timeout', None),
            browser_brand=browser_config_dict.get('browser_brand', None),
            byop_proxy=browser_config_dict.get('byop_proxy', None),
            enable_mcp=browser_config_dict.get('enable_mcp', None),
            solve_captcha=browser_config_dict.get('solve_captcha', None),
        )

Ancestors

Class variables

var CLOUD_BROWSER_HOST

Static methods

def from_dict(browser_config_dict: Dict) ‑> BrowserConfig
Expand source code
@staticmethod
def from_dict(browser_config_dict: Dict) -> 'BrowserConfig':
    proxy_pool = browser_config_dict.get('proxy_pool', None)
    if proxy_pool is not None:
        proxy_pool = ProxyPool(proxy_pool)

    os = browser_config_dict.get('os', None)
    if os is not None:
        os = OperatingSystem(os)

    return BrowserConfig(
        proxy_pool=proxy_pool,
        os=os,
        session=browser_config_dict.get('session', None),
        country=browser_config_dict.get('country', None),
        auto_close=browser_config_dict.get('auto_close', None),
        timeout=browser_config_dict.get('timeout', None),
        debug=browser_config_dict.get('debug', None),
        extensions=browser_config_dict.get('extensions', None),
        block_images=browser_config_dict.get('block_images', None),
        block_styles=browser_config_dict.get('block_styles', None),
        block_fonts=browser_config_dict.get('block_fonts', None),
        block_media=browser_config_dict.get('block_media', None),
        screenshot=browser_config_dict.get('screenshot', None),
        resolution=browser_config_dict.get('resolution', None),
        target_url=browser_config_dict.get('target_url', None),
        cache=browser_config_dict.get('cache', None),
        blacklist=browser_config_dict.get('blacklist', None),
        unblock=browser_config_dict.get('unblock', None),
        unblock_timeout=browser_config_dict.get('unblock_timeout', None),
        browser_brand=browser_config_dict.get('browser_brand', None),
        byop_proxy=browser_config_dict.get('byop_proxy', None),
        enable_mcp=browser_config_dict.get('enable_mcp', None),
        solve_captcha=browser_config_dict.get('solve_captcha', None),
    )

Methods

def to_dict(self) ‑> Dict
Expand source code
def to_dict(self) -> Dict:
    return {
        'proxy_pool': self.proxy_pool.value if isinstance(self.proxy_pool, ProxyPool) else self.proxy_pool,
        'os': self.os.value if isinstance(self.os, OperatingSystem) else self.os,
        'session': self.session,
        'country': self.country,
        'auto_close': self.auto_close,
        'timeout': self.timeout,
        'debug': self.debug,
        'extensions': self.extensions,
        'block_images': self.block_images,
        'block_styles': self.block_styles,
        'block_fonts': self.block_fonts,
        'block_media': self.block_media,
        'screenshot': self.screenshot,
        'resolution': self.resolution,
        'target_url': self.target_url,
        'cache': self.cache,
        'blacklist': self.blacklist,
        'unblock': self.unblock,
        'unblock_timeout': self.unblock_timeout,
        'browser_brand': self.browser_brand,
        'byop_proxy': self.byop_proxy,
        'enable_mcp': self.enable_mcp,
        'solve_captcha': self.solve_captcha,
    }
def websocket_url(self, api_key: str, host: str | None = None) ‑> str
Expand source code
def websocket_url(self, api_key: str, host: Optional[str] = None) -> str:
    params = {'api_key': api_key}

    if self.proxy_pool is not None:
        params['proxy_pool'] = self.proxy_pool.value if isinstance(self.proxy_pool, ProxyPool) else self.proxy_pool

    if self.os is not None:
        params['os'] = self.os.value if isinstance(self.os, OperatingSystem) else self.os

    if self.session is not None:
        params['session'] = self.session

    if self.country is not None:
        params['country'] = self.country

    if self.auto_close is not None:
        params['auto_close'] = self._bool_to_http(self.auto_close)

    if self.timeout is not None:
        params['timeout'] = self.timeout

    if self.debug is not None:
        params['debug'] = self._bool_to_http(self.debug)

    if self.extensions:
        params['extensions'] = ','.join(self.extensions)

    if self.block_images is not None:
        params['block_images'] = self._bool_to_http(self.block_images)

    if self.block_styles is not None:
        params['block_styles'] = self._bool_to_http(self.block_styles)

    if self.block_fonts is not None:
        params['block_fonts'] = self._bool_to_http(self.block_fonts)

    if self.block_media is not None:
        params['block_media'] = self._bool_to_http(self.block_media)

    if self.screenshot is not None:
        params['screenshot'] = self._bool_to_http(self.screenshot)

    if self.resolution is not None:
        params['resolution'] = self.resolution

    if self.target_url is not None:
        params['target_url'] = self.target_url

    if self.cache is not None:
        params['cache'] = self._bool_to_http(self.cache)

    if self.blacklist is not None:
        params['blacklist'] = self._bool_to_http(self.blacklist)

    if self.unblock is not None:
        params['unblock'] = self._bool_to_http(self.unblock)

    if self.unblock_timeout is not None:
        params['unblock_timeout'] = self.unblock_timeout

    if self.browser_brand is not None:
        params['browser_brand'] = self.browser_brand

    if self.byop_proxy is not None:
        params['byop_proxy'] = self.byop_proxy

    if self.enable_mcp is not None:
        params['enable_mcp'] = self._bool_to_http(self.enable_mcp)

    if self.solve_captcha is not None:
        params['solve_captcha'] = self._bool_to_http(self.solve_captcha)

    base_host = host or self.CLOUD_BROWSER_HOST
    return base_host + '?' + urlencode(params)
class OperatingSystem (value, names=None, *, module=None, qualname=None, type=None, start=1)
Expand source code
class OperatingSystem(Enum):
    LINUX = "linux"
    WINDOWS = "windows"
    MACOS = "macos"

An enumeration.

Ancestors

  • enum.Enum

Class variables

var LINUX
var MACOS
var WINDOWS
class ProxyPool (value, names=None, *, module=None, qualname=None, type=None, start=1)
Expand source code
class ProxyPool(Enum):
    DATACENTER = "datacenter"
    RESIDENTIAL = "residential"

An enumeration.

Ancestors

  • enum.Enum

Class variables

var DATACENTER
var RESIDENTIAL