繁体   English   中英

HTTP 客户端无法从电子商务网站检索内容

[英]HTTP client not working for retrieving content from e-commerce website

我正在尝试在 Rust 中实现一个 web 页面观察器。基本思想是,当在页面内容中找不到特定字符串时,我会收到通知。

基本逻辑适用于大多数情况,但对于某些电子商务网站(在本例中为 argos.co.uk),它总是返回一个页面,其中包含“您没有访问权限”。

当然,同一页面在 Safari 上也能正常工作。所以我Copy as cURL ,结果如下:

-X 'GET' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15'

运行复制的 cURL 命令工作正常。 所以我将这两个标头添加到我的 Rust 代码中:

let cli = reqwest::Client::new();
let resp = cli
    .get(url)
    .header(USER_AGENT, r#"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15"#)
    .header(ACCEPT, r#"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"#)
    .send().await?;

而且我仍然得到与上面相同的“您没有权限......”页面。

将上面的代码与httpbin.org/get一起使用表明 Rust reqwest 确实发送了正确的 header。所以我不知道下一步该去哪里寻找。 在我的情况下可能出了什么问题?

编辑

我尝试按照下面的建议将cURL命令与 httpbin 一起使用,并得到以下结果。

   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15",
    "X-Amzn-Trace-Id": "Root=1-62011d4b-5ea67cec2c79826d5d00e959"

我不相信X-Amzn-Trace-Id是由cURL发送的,但我非常愿意被证明是错误的。

正如已经建议的那样,这很可能是基本的 header 验证,以防止抓取。 以下对我有用:

use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let cli = reqwest::Client::new();
    let resp = cli
        .get("https://www.argos.co.uk/product/<YOUR_ID>")
        .header(reqwest::header::ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
        .header(reqwest::header::ACCEPT_ENCODING, "identity")
        .header(reqwest::header::ACCEPT_LANGUAGE, "en-US,en;q=0.5")
        .header(reqwest::header::USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0")
        .send().await?;

    println!("{:?}", resp.status());
    println!("{}", resp.text().await?);

    Ok(())
}

请注意,我已将Accept-Encodinggzip切换为identity 您可以(而且很可能应该)使用gzip 功能

当然,请确保遵守robots.txt和有关抓取的使用条款。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM