[package]
edition = "2021"
rust-version = "1.91"
name = "crawlex"
version = "1.0.4"
build = "build.rs"
exclude = [
"vendor/h2/fixtures/**",
"vendor/h2/ci/**",
"vendor/h2/.github/**",
"vendor/h2/tests/**",
"vendor/h2/benches/**",
"vendor/h2/examples/**",
"vendor/h2/fuzz/**",
"production-validation/**",
".dispatch/**",
".agents/**",
"docs/**",
"sdk/**",
"scripts/**",
]
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "Stealth crawler with Chrome-perfect TLS/H2 fingerprint, render pool, hooks, persistent queue"
homepage = "https://github.com/forattini-dev/crawlex"
documentation = "https://docs.rs/crawlex"
readme = "README.md"
keywords = [
"crawler",
"stealth",
"headless",
"fingerprint",
"chrome",
]
categories = [
"web-programming",
"command-line-utilities",
]
license = "MIT OR Apache-2.0"
repository = "https://github.com/forattini-dev/crawlex"
[features]
cdp-backend = [
"dep:async-tungstenite",
"dep:which",
"dep:fnv",
"dep:futures-timer",
"dep:pin-project-lite",
"dep:dunce",
"dep:reqwest",
]
chromium-fetcher = [
"cdp-backend",
"zip8",
"dep:directories",
]
cli = ["dep:clap"]
default = [
"cli",
"sqlite",
"cdp-backend",
"chromium-fetcher",
]
lua-hooks = [
"dep:mlua",
"cdp-backend",
]
prometheus = []
sqlite = ["dep:rusqlite"]
zip0 = ["dep:zip0"]
zip8 = ["dep:zip8"]
[lib]
name = "crawlex"
path = "src/lib.rs"
[[bin]]
name = "crawlex"
path = "src/bin/full.rs"
required-features = [
"cli",
"sqlite",
"cdp-backend",
]
[[bin]]
name = "crawlex-mini"
path = "src/bin/mini.rs"
required-features = [
"cli",
"sqlite",
]
[[example]]
name = "embedded_with_hooks"
path = "examples/embedded_with_hooks.rs"
[[test]]
name = "action_policy_wiring"
path = "tests/action_policy_wiring.rs"
[[test]]
name = "antibot_detection"
path = "tests/antibot_detection.rs"
[[test]]
name = "artifact_storage"
path = "tests/artifact_storage.rs"
[[test]]
name = "browser_launch_flags"
path = "tests/browser_launch_flags.rs"
[[test]]
name = "charset_ladder"
path = "tests/charset_ladder.rs"
[[test]]
name = "chrome_request_kind"
path = "tests/chrome_request_kind.rs"
[[test]]
name = "cli_args"
path = "tests/cli_args.rs"
[[test]]
name = "connection_coalescing"
path = "tests/connection_coalescing.rs"
[[test]]
name = "cookie_pinning"
path = "tests/cookie_pinning.rs"
[[test]]
name = "crawl_pattern_shape"
path = "tests/crawl_pattern_shape.rs"
[[test]]
name = "dedupe"
path = "tests/dedupe.rs"
[[test]]
name = "doh_live"
path = "tests/doh_live.rs"
[[test]]
name = "e2e"
path = "tests/e2e.rs"
[[test]]
name = "escalation"
path = "tests/escalation.rs"
[[test]]
name = "events"
path = "tests/events.rs"
[[test]]
name = "fingerprint"
path = "tests/fingerprint.rs"
[[test]]
name = "fpjs_compliance"
path = "tests/fpjs_compliance.rs"
[[test]]
name = "google_images_live"
path = "tests/google_images_live.rs"
[[test]]
name = "h2_fingerprint_live"
path = "tests/h2_fingerprint_live.rs"
[[test]]
name = "html_clean"
path = "tests/html_clean.rs"
[[test]]
name = "identity_bundle"
path = "tests/identity_bundle.rs"
[[test]]
name = "identity_coherence"
path = "tests/identity_coherence.rs"
[[test]]
name = "infra_scaffold_interfaces"
path = "tests/infra_scaffold_interfaces.rs"
[[test]]
name = "keyboard_bimodal"
path = "tests/keyboard_bimodal.rs"
[[test]]
name = "link_filter"
path = "tests/link_filter.rs"
[[test]]
name = "live_news_navigation"
path = "tests/live_news_navigation.rs"
[[test]]
name = "mini_http_only"
path = "tests/mini_http_only.rs"
[[test]]
name = "motion_device_profile"
path = "tests/motion_device_profile.rs"
[[test]]
name = "motion_engine"
path = "tests/motion_engine.rs"
[[test]]
name = "motion_idle"
path = "tests/motion_idle.rs"
[[test]]
name = "motion_live"
path = "tests/motion_live.rs"
[[test]]
name = "motion_scroll"
path = "tests/motion_scroll.rs"
[[test]]
name = "motion_submovement"
path = "tests/motion_submovement.rs"
[[test]]
name = "ndjson_stream"
path = "tests/ndjson_stream.rs"
[[test]]
name = "page_pool"
path = "tests/page_pool.rs"
[[test]]
name = "policy_engine"
path = "tests/policy_engine.rs"
[[test]]
name = "proxy_router"
path = "tests/proxy_router.rs"
[[test]]
name = "queue_delay"
path = "tests/queue_delay.rs"
[[test]]
name = "queue_pop"
path = "tests/queue_pop.rs"
[[test]]
name = "real_world_antibot_live"
path = "tests/real_world_antibot_live.rs"
[[test]]
name = "recaptcha_solver_smoke"
path = "tests/recaptcha_solver_smoke.rs"
[[test]]
name = "render_budgets"
path = "tests/render_budgets.rs"
[[test]]
name = "screenshot_mode_parse"
path = "tests/screenshot_mode_parse.rs"
[[test]]
name = "script_executor"
path = "tests/script_executor.rs"
[[test]]
name = "script_runner"
path = "tests/script_runner.rs"
[[test]]
name = "script_spec"
path = "tests/script_spec.rs"
[[test]]
name = "session_registry"
path = "tests/session_registry.rs"
[[test]]
name = "session_scope_policy"
path = "tests/session_scope_policy.rs"
[[test]]
name = "sitemap"
path = "tests/sitemap.rs"
[[test]]
name = "spa_deep_crawl_live"
path = "tests/spa_deep_crawl_live.rs"
[[test]]
name = "spa_hash_routing_live"
path = "tests/spa_hash_routing_live.rs"
[[test]]
name = "spa_lua_flow_live"
path = "tests/spa_lua_flow_live.rs"
[[test]]
name = "spa_observer_js"
path = "tests/spa_observer_js.rs"
[[test]]
name = "spa_render_live"
path = "tests/spa_render_live.rs"
[[test]]
name = "spa_scriptspec_live"
path = "tests/spa_scriptspec_live.rs"
[[test]]
name = "state_persistence"
path = "tests/state_persistence.rs"
[[test]]
name = "stealth_runtime_live"
path = "tests/stealth_runtime_live.rs"
[[test]]
name = "stealth_shim_leaks"
path = "tests/stealth_shim_leaks.rs"
[[test]]
name = "stone_com_br_live"
path = "tests/stone_com_br_live.rs"
[[test]]
name = "tech_fingerprint"
path = "tests/tech_fingerprint.rs"
[[test]]
name = "tetis_io_live"
path = "tests/tetis_io_live.rs"
[[test]]
name = "throughput_live"
path = "tests/throughput_live.rs"
[[test]]
name = "tls_catalog_coverage"
path = "tests/tls_catalog_coverage.rs"
[[test]]
name = "tls_catalog_roundtrip"
path = "tests/tls_catalog_roundtrip.rs"
[[test]]
name = "tls_clienthello"
path = "tests/tls_clienthello.rs"
[[test]]
name = "tls_extension_order"
path = "tests/tls_extension_order.rs"
[[test]]
name = "tls_live_match"
path = "tests/tls_live_match.rs"
[[test]]
name = "typing_engine"
path = "tests/typing_engine.rs"
[[test]]
name = "url_permutations"
path = "tests/url_permutations.rs"
[[test]]
name = "vendor_telemetry"
path = "tests/vendor_telemetry.rs"
[[test]]
name = "webrtc_leak_audit"
path = "tests/webrtc_leak_audit.rs"
[[test]]
name = "worker_shim_live"
path = "tests/worker_shim_live.rs"
[dependencies.anyhow]
version = "1"
[dependencies.async-trait]
version = "0.1"
[dependencies.async-tungstenite]
version = "0.32"
features = ["tokio-runtime"]
optional = true
[dependencies.base64]
version = "0.22"
[dependencies.boring]
version = "5"
[dependencies.boring-sys]
version = "5"
[dependencies.brotli]
version = "8"
[dependencies.bytes]
version = "1"
[dependencies.clap]
version = "4"
features = [
"derive",
"env",
]
optional = true
[dependencies.cookie]
version = "0.18"
[dependencies.dashmap]
version = "6"
[dependencies.directories]
version = "6"
optional = true
[dependencies.dunce]
version = "1"
optional = true
[dependencies.encoding_rs]
version = "0.8"
[dependencies.flate2]
version = "1"
[dependencies.fnv]
version = "1"
optional = true
[dependencies.foreign-types]
version = "0.5"
[dependencies.futures]
version = "0.3"
[dependencies.futures-timer]
version = "3"
optional = true
[dependencies.growable-bloom-filter]
version = "2"
[dependencies.hex]
version = "0.4"
[dependencies.hickory-resolver]
version = "0.26"
[dependencies.http]
version = "1"
[dependencies.http-body-util]
version = "0.1"
[dependencies.hyper]
version = "1"
features = [
"http1",
"http2",
"client",
]
[dependencies.hyper-util]
version = "0.1"
features = [
"client",
"tokio",
"http1",
"http2",
]
[dependencies.indexmap]
version = "2"
features = ["serde"]
[dependencies.kuchikiki]
version = "0.8"
[dependencies.mlua]
version = "0.11"
features = [
"lua54",
"async",
"vendored",
"send",
"serialize",
]
optional = true
[dependencies.murmur3]
version = "0.5"
[dependencies.parking_lot]
version = "0.12"
[dependencies.pin-project-lite]
version = "0.2"
optional = true
[dependencies.psl]
version = "2"
[dependencies.rand]
version = "0.10"
[dependencies.regex]
version = "1"
[dependencies.reqwest]
version = "0.13"
features = [
"rustls",
"json",
]
optional = true
default-features = false
[dependencies.roxmltree]
version = "0.20"
[dependencies.rusqlite]
version = "0.39"
features = ["bundled"]
optional = true
[dependencies.scraper]
version = "0.26"
[dependencies.serde]
version = "1"
features = ["derive"]
[dependencies.serde_json]
version = "1"
[dependencies.sha2]
version = "0.11"
[dependencies.texting_robots]
version = "0.2"
[dependencies.thiserror]
version = "2"
[dependencies.time]
version = "0.3"
features = [
"serde",
"formatting",
"parsing",
]
[dependencies.tokio]
version = "1"
features = ["full"]
[dependencies.tokio-boring]
version = "5"
[dependencies.tracing]
version = "0.1"
[dependencies.tracing-subscriber]
version = "0.3"
features = [
"env-filter",
"json",
]
[dependencies.url]
version = "2"
features = ["serde"]
[dependencies.which]
version = "8"
optional = true
[dependencies.zip0]
version = "0.6"
features = ["deflate"]
optional = true
default-features = false
package = "zip"
[dependencies.zip8]
version = "8"
features = ["deflate-flate2-zlib-rs"]
optional = true
default-features = false
package = "zip"
[dependencies.zstd]
version = "0.13"
[dev-dependencies.tempfile]
version = "3"
[dev-dependencies.tokio]
version = "1"
features = [
"full",
"test-util",
]
[dev-dependencies.wiremock]
version = "0.6"
[build-dependencies.serde]
version = "1"
features = ["derive"]
[build-dependencies.serde_json]
version = "1"
[build-dependencies.serde_yaml]
version = "0.9"
[target."cfg(windows)".dependencies.windows-registry]
version = "0.6"
[target."cfg(windows)".dependencies.windows-version]
version = "0.1"
[lints.clippy]
await_holding_lock = "deny"
[lints.clippy.all]
level = "warn"
priority = -1
[profile.release]
lto = "fat"
codegen-units = 1
panic = "abort"
strip = true