我正在尝试使用 tokio 异步运行时在 Rust 中编写一个网络爬虫。我想异步获取/处理多个页面,但我也希望爬虫在到达末尾时停止(换句话说,如果没有什么可爬的)。到目前为止,我已经使用futures::future::try_join_all从我提供为Future
s 的异步函数中获取集体结果,但这显然需要程序事先知道要抓取的总页数。例如:
async fn fetch(_url: String) -> Result<String, ()> {
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
Ok(String::from("foo"))
}
#[tokio::main]
async fn main() {
let search_url = "https://example.com/?page={page_num}";
let futures = (1..=3)
.map(|page_num| search_url.replace("{page_num}", &page_num.to_string()))
.map(|url| fetch(url));
let _ = futures::future::try_join_all(futures).await.unwrap();
}
在这个简单的示例中,我必须知道要通过 ( 1..=3
) 的总页数,然后才能实际获取它们。我想要的是,不提供任何范围并且有条件停止整个过程。(例如,如果 HTML 结果包含“未找到”)
我查看了futures::executor::block_on但我不确定它是否可以用于这项任务。