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=Truethe 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)
| File | Size | Uploaded | |
|---|---|---|---|
| mudfish-0.2.2.tar.gz | 94.1 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| 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
|