Skip to main content

Chrome-driven SaaS content scraper — yields a uniform Document stream for downstream pipelines (pleno-anonymize, pleno-secret-scanner).

Project description

saas-scraper

Chrome-driven SaaS content scraper. Yields a uniform Document stream for downstream pipelines (e.g. pleno-anonymize, pleno-secret-scanner).

Where API-based connectors stop — locked-down workspaces, SSO-only sessions, content only visible in the UI — saas-scraper keeps going by driving a real Chrome session via Playwright. Reuses your existing browser profile so login, MFA and SSO flows are inherited rather than re-implemented per provider.

Install

uv add saas-scraper
# one-time browser binary install
uv run playwright install chromium

Or as a CLI:

pipx install saas-scraper
playwright install chromium

Usage

# List available connectors
saas-scraper list

# Scrape a Slack workspace and stream Documents to stdout (NDJSON)
saas-scraper fetch slack --workspace acme --since 7d

# Save to a file for downstream consumption
saas-scraper fetch notion --workspace acme > docs.ndjson

Programmatic use:

import asyncio
from saas_scraper import BrowserSession, registry

async def main() -> None:
    async with BrowserSession() as session:
        connector = registry.create("slack", session=session, workspace="acme")
        async for doc in connector.discover_and_fetch():
            print(doc.ref.path, len(doc.text or b""))

asyncio.run(main())

Connectors

Connector Status Notes
slack implemented (v0.2) channel sidebar walk, message pane scrape
github implemented (v0.3) file-tree walk + raw fetch, public + SSO repos
gitlab implemented (v0.3) gitlab.com or self-hosted via base_url
bitbucket implemented (v0.3) bitbucket.org file walk
jira implemented (v0.3) Atlassian Cloud issue list + body
confluence implemented (v0.3) Atlassian Cloud space page-tree
notion implemented (v0.3) sidebar page enumeration + body

All connectors share a single BrowserSession so cookies and SSO state inherit across providers. Virtualised lists (Slack sidebar, Notion sidebar) only see the currently-visible portion in v0.3 — scroll-walking lands in v0.4.

The v0.1.0 release ships the Document protocol, the Chrome session manager, and a working scaffold per connector. Additional providers and per-connector hardening land in subsequent releases — see issues.

Why Chrome and not the API?

  • Inherits SSO / MFA / SCIM-locked sessions that don't cleanly expose API tokens to a scanner role.
  • Bypasses API quota tiers that throttle org-wide content enumeration.
  • Reaches UI-only surfaces (Notion comments, Slack canvas, Jira views).

When an official API exists and is sufficient, prefer that — saas-scraper is the fallback for the cases where it isn't.

Development

uv sync --all-extras
uv run playwright install chromium
uv run pytest
uv run ruff check
uv run mypy src

The default pytest pass exercises plumbing only (Document protocol, registry wiring, CLI helpers). Live browser scrapes against real SaaS providers are not part of CI; run them locally with saas-scraper fetch <connector> --headed so a real Chromium window opens for first-time SSO.

Release

vX.Y.Z tag pushes trigger PyPI trusted publishing via GitHub Actions — no manual token. The first publish requires a one-time Trusted Publisher configuration at https://pypi.org/manage/account/publishing/:

Field Value
PyPI Project Name saas-scraper
Owner plenoai
Repository name saas-scraper
Workflow name release.yml
Environment name pypi

After that, every tag matching v* will publish automatically.

License

AGPL-3.0-or-later.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

saas_scraper-0.3.0.tar.gz (30.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

saas_scraper-0.3.0-py3-none-any.whl (42.5 kB view details)

Uploaded Python 3

File details

Details for the file saas_scraper-0.3.0.tar.gz.

File metadata

  • Download URL: saas_scraper-0.3.0.tar.gz
  • Upload date:
  • Size: 30.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for saas_scraper-0.3.0.tar.gz
Algorithm Hash digest
SHA256 29fb33015f2f0b10e1615ac415b2268e3f70ed2409115d603443aec1c6daa677
MD5 68a33060b5ced1aa3ef1e5b1f996a08b
BLAKE2b-256 f2097246abc8d13dbf7f616c9340dfaff86f7250d1829be1b046d11220ccffd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for saas_scraper-0.3.0.tar.gz:

Publisher: release.yml on plenoai/saas-scraper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file saas_scraper-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: saas_scraper-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 42.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for saas_scraper-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bbb83f156f861be9314b47f78e598c5bd14a6eda7a36ff8f2f3ccdd6efcabedc
MD5 fc314277086b23c6e9b162a8fe459d23
BLAKE2b-256 4affc6d337bf4dc34a9bcade296005c9054cb8da71746e5970b89dec300ec8d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for saas_scraper-0.3.0-py3-none-any.whl:

Publisher: release.yml on plenoai/saas-scraper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page