#networking #firewall #network-firewall

spider_network_blocker

Web crawler network blocking urls and patterns

75 releases

0.0.84 May 3, 2026
0.0.66 Mar 31, 2026
0.0.51 Dec 24, 2025
0.0.36 Nov 17, 2025
0.0.12 Jun 7, 2025

#219 in Network programming

Download history 15428/week @ 2026-01-23 21349/week @ 2026-01-30 51921/week @ 2026-02-06 54482/week @ 2026-02-13 79265/week @ 2026-02-20 86771/week @ 2026-02-27 102082/week @ 2026-03-06 88884/week @ 2026-03-13 54453/week @ 2026-03-20 46039/week @ 2026-03-27 69834/week @ 2026-04-03 68087/week @ 2026-04-10 63337/week @ 2026-04-17 56571/week @ 2026-04-24 36170/week @ 2026-05-01 5527/week @ 2026-05-08

171,864 downloads per month
Used in 10 crates (2 directly)

MIT license

97KB
2K SLoC

spider_network_blocker

A Rust library to block ads, trackers, and embeds for networking.

Installation

Add spider_network_blocker to your Cargo project with:

cargo add spider_network_blocker
use spider_network_blocker::{xhr::URL_IGNORE_XHR_TRIE, scripts::URL_IGNORE_TRIE};

let xhr_blocked = URL_IGNORE_XHR_TRIE.contains_prefix(".doubleclick.net");
let script_blocked = URL_IGNORE_TRIE.contains_prefix(".doubleclick.net");

Dynamic Block List

Extend your block list at runtime without rebuilding. The DynamicBlockList is fully lock-free — reads are wait-free and writes never block readers.

use spider_network_blocker::dynamic_blocklist::DynamicBlockList;

// Start empty or pre-seeded
let blocklist = DynamicBlockList::new();

// Seed from a remote source (replaces all patterns)
let remote_patterns = vec![
    "https://ads.example.com/",
    "https://tracker.example.com/",
];
blocklist.seed(remote_patterns.into_iter());

// Extend with additional patterns — no cloning, just appends a new layer
blocklist.extend(["https://pixel.example.com/"]);
blocklist.extend(["https://analytics.example.com/"]);

// Lock-free check on the hot path
if blocklist.is_blocked("https://ads.example.com/banner.js") {
    // blocked
}

// After many extends, compact layers into one for lookup efficiency
blocklist.compact();

Sharing across threads

use spider_network_blocker::dynamic_blocklist::DynamicBlockList;
use std::sync::Arc;

let blocklist = Arc::new(DynamicBlockList::from_patterns([
    "https://ads.example.com/",
]));

// Reader threads — wait-free, no contention
let bl = Arc::clone(&blocklist);
std::thread::spawn(move || {
    bl.is_blocked("https://ads.example.com/banner.js");
});

// Writer thread — builds new layer, atomically swaps
let bl = Arc::clone(&blocklist);
std::thread::spawn(move || {
    bl.extend(["https://new-tracker.example.com/"]);
});

Contributing

Contributions and improvements are welcome. Feel free to open issues or submit pull requests on the GitHub repository.

License

This project is licensed under the MIT License.

Dependencies

~3–6.5MB
~116K SLoC