1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//! # a3s-search
//!
//! An embeddable meta search engine library inspired by SearXNG.
//!
//! This library provides a framework for aggregating search results from multiple
//! search engines, with support for:
//!
//! - Async parallel search execution
//! - Result deduplication and merging
//! - Configurable ranking algorithms
//! - Extensible engine interface
//! - Dynamic proxy IP pool for anti-crawler protection
//!
//! ## Example
//!
//! ```rust,no_run
//! use a3s_search::{Search, SearchQuery, engines::DuckDuckGo};
//!
//! #[tokio::main]
//! async fn main() -> anyhow::Result<()> {
//! let mut search = Search::new();
//! search.add_engine(DuckDuckGo::new());
//!
//! let query = SearchQuery::new("rust programming");
//! let results = search.search(query).await?;
//!
//! for result in results.items() {
//! println!("{}: {}", result.title, result.url);
//! }
//! Ok(())
//! }
//! ```
//!
//! ## Using Proxy
//!
//! ```rust,no_run
//! use a3s_search::{Search, SearchQuery, engines::DuckDuckGo, HttpFetcher, PageFetcher};
//! use std::sync::Arc;
//!
//! #[tokio::main]
//! async fn main() -> anyhow::Result<()> {
//! let fetcher: Arc<dyn PageFetcher> = Arc::new(
//! HttpFetcher::with_proxy("http://proxy1.example.com:8080")?
//! );
//!
//! let mut search = Search::new();
//! search.add_engine(DuckDuckGo::with_fetcher(
//! a3s_search::engines::DuckDuckGoParser, fetcher,
//! ));
//!
//! let query = SearchQuery::new("rust programming");
//! let results = search.search(query).await?;
//!
//! Ok(())
//! }
//! ```
//!
//! ## Using Dynamic Proxy Pool
//!
//! ```rust,no_run
//! use std::sync::Arc;
//! use a3s_search::{Search, SearchQuery, PooledHttpFetcher, PageFetcher};
//! use a3s_search::engines::{DuckDuckGo, DuckDuckGoParser};
//! use a3s_search::proxy::{ProxyPool, ProxyProvider, ProxyConfig, spawn_auto_refresh};
//!
//! // Implement your own provider to fetch proxies from any source
//! struct MyProxyProvider { /* ... */ }
//!
//! #[async_trait::async_trait]
//! impl ProxyProvider for MyProxyProvider {
//! async fn fetch_proxies(&self) -> a3s_search::Result<Vec<ProxyConfig>> {
//! // Fetch from your proxy API, database, etc.
//! Ok(vec![ProxyConfig::new("10.0.0.1", 8080)])
//! }
//! fn refresh_interval(&self) -> std::time::Duration {
//! std::time::Duration::from_secs(60) // refresh every minute
//! }
//! }
//!
//! #[tokio::main]
//! async fn main() -> anyhow::Result<()> {
//! let pool = Arc::new(ProxyPool::with_provider(MyProxyProvider { /* ... */ }));
//! let _refresh_handle = spawn_auto_refresh(Arc::clone(&pool));
//!
//! let fetcher: Arc<dyn PageFetcher> = Arc::new(PooledHttpFetcher::new(Arc::clone(&pool)));
//!
//! let mut search = Search::new();
//! search.add_engine(DuckDuckGo::with_fetcher(DuckDuckGoParser, fetcher));
//!
//! let query = SearchQuery::new("rust programming");
//! let results = search.search(query).await?;
//! Ok(())
//! }
//! ```
pub use Aggregator;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use Search;
pub use ;