Profiles

Profiles describe browser-visible settings such as viewport, locale, timezone, language headers, and device characteristics.

Built-in profiles

from webskrap import get_profile, list_profiles
 
for profile in list_profiles():
    print(profile.name)
 
profile = get_profile("desktop-chrome")

Built-in profile names:

  • desktop-chrome
  • desktop-edge
  • mobile-chrome

get_profile() returns a copy, so you can adjust it without mutating the bundled profile:

profile = get_profile("desktop-chrome")
profile.locale = "fr-FR"
profile.navigator_languages = ["fr-FR", "fr", "en-US", "en"]

Custom profile

from webskrap import BrowserProfile, Viewport
 
profile = BrowserProfile(
    name="fr-desktop",
    viewport=Viewport(width=1440, height=900),
    screen=Viewport(width=1440, height=900),
    locale="fr-FR",
    timezone_id="Europe/Paris",
    navigator_languages=["fr-FR", "fr", "en-US", "en"],
)

Pass it to a session:

session = await client.session("fr", profile=profile)

Or use it for a one-shot fetch:

result = await client.fetch("https://example.com", profile=profile)

Language headers

BrowserProfile keeps locale, navigator_languages, and the generated Accept-Language header coherent. The first language gets full weight and later languages get descending quality weights:

profile = BrowserProfile(
    name="fr",
    locale="fr-FR",
    navigator_languages=["fr-FR", "fr", "en-US", "en"],
)
print(profile.accept_language())
# fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7

Extra headers are merged after WebSkrap's defaults:

profile = BrowserProfile(
    name="api-docs",
    extra_http_headers={"DNT": "1"},
)

Mobile profile

Use the built-in mobile profile when viewport, touch, and mobile user-agent settings should move together:

result = await client.fetch("https://example.com", profile="mobile-chrome")

For custom mobile profiles, keep viewport, screen, device_scale_factor, is_mobile, has_touch, and user_agent coherent.