如何在Rust中处理ToManyRedirects panics?

gfttwv5a  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(72)

我有一个Rust项目,它使用了“reqwest”crate,并具有以下功能:

fn elem_html_vec(url: &String, element: &str, vec_elem: &mut Vec<String>) {
    let response: String = get(url)
        .expect("Could not load URL.")
        .text()
        .expect("Could not load text");
    let document: scraper::Html = scraper::Html::parse_document(&response);
    let parsed_elements: scraper::Selector = scraper::Selector::parse(element).unwrap();
    for elem in document.select(&parsed_elements) {
        vec_elem.push(elem.inner_html());
    }
}

字符串
但是当我调用函数时,“url”参数(“https://twitter.com/Lions”)是一个指向网页的链接,将您重定向到另一个页面,我得到下面的错误消息。

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: reqwest::Error { kind: Redirect, url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("twitter.com")), port: None, path: "/Lions", query: None, fragment: None }, source: TooManyRedirects }', src/main.rs:79:37
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


我想让它得到它重定向到的最后一页的日期。我该怎么做呢?

4zcjmb1e

4zcjmb1e1#

https://twitter.com/Lions重定向到https://twitter.com/i/flow/login?redirect_after_login=%2FLions,并使用头set-cookie: guest_id=...设置cookie。如果您没有在重定向的请求上设置cookie,则它会重定向到相同的位置,从而导致无限循环。
您需要配置reqwest以使用cookie,可能使用cookie_store方法。为此,您需要将reqwest::get调用替换为使用ClientBuilder创建的Client

anauzrmj

anauzrmj2#

我通过使用“reqwest”中的“重定向”特性找到了一个解决方案。下面是代码。

fn elem_html_vec(url: &String, element: &str, vec_elem: &mut Vec<String>) {
    let redirect_rules: redirect::Policy =
        reqwest::redirect::Policy::custom(|attempt: redirect::Attempt<'_>| {
            if attempt.previous().len() > 5 {
                attempt.stop()
            } else {
                attempt.follow()
            }
        });
    let client: Client = Client::builder().redirect(redirect_rules).build().unwrap();
    let response: String = client.get(url).send().unwrap().text().unwrap();
    let document: scraper::Html = scraper::Html::parse_document(&response);
    let parsed_elements: scraper::Selector = scraper::Selector::parse(element).unwrap();
    for elem in document.select(&parsed_elements) {
        vec_elem.push(elem.inner_html());
    }
}

字符串

相关问题