
[英]http 403 error from CloudFront after attempting to upload image in Magento e-commerce platform for some users
[英]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-Encoding
从gzip
切换为identity
。 您可以(而且很可能应该)使用gzip 功能。
当然,请确保遵守robots.txt
和有关抓取的使用条款。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.