Skip to main content

mudfish

Python bindings for Mudfish Crawler, a Rust-native web crawling and intelligence engine.

This package wraps the Rust crawl engine directly (via PyO3) — there is no subprocess or network hop to a separate server. It exposes a typed, Pythonic API over the engine; the Rust project itself is at an early stage (see the main repo's ROADMAP_HONEST.md for full status).

Install

pip install mudfish

Usage

import mudfish

result = mudfish.crawl("https://example.com", depth=2, concurrency=30)

print(result.stats.urls_fetched, result.stats.duration_secs)
for page in result:                          # CrawlResult is iterable over its pages
    print(page.status_code, page.url, page.title)

crawl() blocks until the crawl finishes (or hits max_urls / max_duration_secs) and returns a typed CrawlResult:

Object Fields
CrawlResult crawl_id, pages: list[Page], errors: list[CrawlError], stats: CrawlStats — iterable over pages, len() is the page count, plus ok_pages
Page url, final_url, status_code, content_type, depth, metadata: PageMetadata, links: list[Link], body_bytes, fetched_via: FetchMethod — helpers title, is_ok
PageMetadata title, meta_description, canonical
Link url, anchor_text, rel
CrawlError url, message
CrawlStats urls_discovered, urls_fetched, urls_skipped, errors, bytes_downloaded, duration_ms — helpers duration_secs, throughput_per_sec
FetchMethod FetchMethod.HTTP ("Http") / FetchMethod.BROWSER ("Browser")

Every typed object also supports the raw engine dict shape (result["stats"], page["status_code"], page.to_dict()), so code written against earlier versions keeps working. If you only want the raw dict, use mudfish.crawl_dict(...).

Async

crawl_async() runs the blocking engine on a worker thread, so it composes with asyncio and several crawls can run concurrently:

import asyncio
import mudfish

async def main() -> None:
    results = await asyncio.gather(
        mudfish.crawl_async("https://a.example"),
        mudfish.crawl_async("https://b.example"),
    )
    for result in results:
        print(result.stats.urls_fetched)

asyncio.run(main())

Reusable configuration

crawler = mudfish.Crawler(depth=1, concurrency=10)
home = crawler.crawl("https://example.com")
blog = await crawler.crawl_async("https://example.com/blog")

Errors

try:
    mudfish.crawl("not-a-url")
except mudfish.InvalidURLError:      # also a ValueError
    ...
except mudfish.CrawlFailedError:     # also a RuntimeError
    ...

Everything derives from mudfish.MudfishError.

Options

All keyword-only, matching the CLI's flags (also available as the CrawlOptions dataclass):

Parameter Default Meaning
depth 3 Max link-following depth
concurrency 50 Max requests in flight, whole crawl
per_host_concurrency 4 Max requests in flight per host
same_domain True Restrict crawl to the seed's resolved domain
max_urls 10000 Hard cap on URLs fetched
max_duration_secs None Optional wall-clock budget
timeout_secs 30 Per-request timeout
request_delay_ms 0 Min delay between requests to the same host
max_response_bytes 20 MB Per-response size cap
respect_robots True Honor robots.txt
allow_private_networks False Permit loopback/private targets (internal use only)
render_js False Re-render JS-dependent pages in headless Chrome (needs Chrome on the host; much slower)
render_settle_ms 2000 When render_js is on, settle time before capturing a rendered page

Limitations

  • Chrome is not bundled. With render_js=True the engine drives a headless Chrome that must already be installed on the host; if it cannot be launched, the crawl logs a warning and falls back to static HTML.
  • Single-platform wheels initially. Built and published from the maintainer's machine, not a cross-platform CI matrix yet — check PyPI for which platforms have wheels; others will need a Rust toolchain to build from source.

License

Apache-2.0.

Metadata

Release files for mudfish 0.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mudfish 0.2.2
File Size Uploaded
mudfish-0.2.2.tar.gz 94.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for mudfish 0.2.2
File
mudfish-0.2.2-cp39-abi3-win_arm64.whl CPython 3.9 abi3 Windows ARM64 Details
mudfish-0.2.2-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details
mudfish-0.2.2-cp39-abi3-musllinux_1_2_x86_64.whl CPython 3.9 abi3 Linux musl 1.2+ x86-64 Details
mudfish-0.2.2-cp39-abi3-musllinux_1_2_aarch64.whl CPython 3.9 abi3 Linux musl 1.2+ ARM64 Details
mudfish-0.2.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details
mudfish-0.2.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 abi3 Linux glibc 2.17+ ARM64 Details
mudfish-0.2.2-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details
mudfish-0.2.2-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details

Total release size: 41.4 MB

Release files / mudfish-0.2.2.tar.gz

Download URL mudfish-0.2.2.tar.gz
Size 94.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c2003b42a068be04f2943bc7e3a3a55f8bd8eb8d273699ae0c244f24f020ca60
BLAKE2b-256 checksum
How to use checksums
b749c117046032e9d703b5d94d0b2c4e7d31bde55939213026672c3a14ad837e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-win_arm64.whl

Download URL mudfish-0.2.2-cp39-abi3-win_arm64.whl
Size 4.8 MB
Tags CPython 3.9 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
4c822076d471a9452c22fcbfac3c4b2d9e33cc429ba284edbaaab300b8e3d9ea
BLAKE2b-256 checksum
How to use checksums
82f0e89bbd7acd32f30a5ef1b2a62e00b2c3e2882b7a7da9f49e417a0485147e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-win_amd64.whl

Download URL mudfish-0.2.2-cp39-abi3-win_amd64.whl
Size 5.0 MB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
3637f57db6073ef67d0db6f70cc3ba36ad13f58409a9b3ac9c2e586d0e262e5f
BLAKE2b-256 checksum
How to use checksums
335e3b862c5144301c812568a53075d9813f1e9e69878e3b2471a22bda976c64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-musllinux_1_2_x86_64.whl

Download URL mudfish-0.2.2-cp39-abi3-musllinux_1_2_x86_64.whl
Size 5.6 MB
Tags CPython 3.9 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
2ecec1e34fdfed3a9582fbca8dc40be29405aa6355b354fbb8f3076f4bf991ef
BLAKE2b-256 checksum
How to use checksums
3727ad56c31e053ac2f7ec0a1cf4bd2732b3e22b21a26c5924784cd1a9da7c0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-musllinux_1_2_aarch64.whl

Download URL mudfish-0.2.2-cp39-abi3-musllinux_1_2_aarch64.whl
Size 5.3 MB
Tags CPython 3.9 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
cf4503f97de2349d59f09f47f62805bdb13facfe870f30a2bd8bcb57314caea3
BLAKE2b-256 checksum
How to use checksums
be368c35c10738c2f90193967fa912876a02e0ba111b56c3287260369e65c7db
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL mudfish-0.2.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.4 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
191638ea2852934152bfd3464de990b102e138be0747d59f2cfff48f7b87e25f
BLAKE2b-256 checksum
How to use checksums
9c0957b557f0a0e164ccba0d57abe7b3fbb489c103d43e965b9680e677a8e943
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL mudfish-0.2.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 5.2 MB
Tags CPython 3.9 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
c551839e2d6620f64a2b884918b1287e08e5ca6a64bf0ef47318928b75d288b6
BLAKE2b-256 checksum
How to use checksums
d946c9a24bd2dd2ccba39906d4e388ee14a8db53a217eb62d38711b20e633b8c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mudfish-0.2.2-cp39-abi3-macosx_11_0_arm64.whl

Download URL mudfish-0.2.2-cp39-abi3-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a2147346197d97df11afe56d4d8ae4872540fe8ca5f87216a9fab03d066a7733
BLAKE2b-256 checksum
How to use checksums
212f46bde6a640f45e9b52e7bdfa1069ab3f1214f6fbc66c81e619e959f9a02d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Release files / mudfish-0.2.2-cp39-abi3-macosx_10_12_x86_64.whl

Download URL mudfish-0.2.2-cp39-abi3-macosx_10_12_x86_64.whl
Size 5.2 MB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
4a178d3d56d1035d77596678ff04a79bbee40f8f0b19dee943c10f61093d0747
BLAKE2b-256 checksum
How to use checksums
fbc7194ea5bf6f9bbaf7dca1f0ac61fc375486b8aa906e8edf758ef7ce08fbe4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.2.4

2 release files

0.2.3

9 release files

This release

0.2.2 This release

9 release files

0.2.1

9 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page