WebClient 仅针对此网站返回 403 错误?



我正在尝试使用 C# WebClient 从这些链接下载文件,但出现 403 错误。

https://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=5&pageSize=500

https://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=4&pageSize=500

我尝试使用不同的用户代理,接受编码等。 我替换并尝试从网址将https转换为http,但没有成功。 当我将这些网址粘贴到 Chrome 或 FireFox 或 IE 中时,我能够下载文件,有时它会给出 403 错误,然后我从 url 将 https 替换为 http,它会下载。但是在网络客户端上没有成功 尝试提琴手检查,没有成功 有人可以在您的系统中尝试,解决此问题。

这是我的代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
WebClient client= new WebClient();
Uri request_url = new Uri("https://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=5&pageSize=500);
//tried http also http://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=5&pageSize=500
client.Headers.Add("user-agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
client.DownloadFile(request_url, @"E:123.csv");

我知道有很多与此主题相关的线程,我尝试了所有线程,没有成功,请不要标记重复。在您的系统中尝试,这<10 行代码。

注意:相同的代码适用于其他网站,仅此网站会给出错误。

正如我在评论中提到的,这里的问题是服务器期望存在cookie(特别是"i10c.bdddb"),并且在不存在时给出403错误。但是,Cookie 与 403 响应一起发送。因此,您可以发出初始垃圾请求,该请求将失败,但会给您cookie。在此之后,您可以照常进行。

通过一些反复试验,我能够使用以下代码获取CSV:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
CookieContainer cookieContainer = new CookieContainer();
Uri baseUri = new Uri("https://www.digikey.com");
using (HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (HttpClient client = new HttpClient(handler) { BaseAddress =  baseUri})
{
//The User-Agent is required (what values work would need to be tested)
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0");
//Make our initial junk request that will fail but get the cookie
HttpResponseMessage getCookiesResponse = await client.GetAsync("/product-search/download.csv");
//Check if we actually got cookies
if (cookieContainer.GetCookies(baseUri).Count > 0)
{
//Try getting the data
HttpResponseMessage dataResponse = await client.GetAsync("product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=4&pageSize=500");
if(dataResponse.StatusCode == HttpStatusCode.OK)
{
Console.Write(await dataResponse.Content.ReadAsStringAsync());
}
}
else
{
throw new Exception("Failed to get cookies!");
}
}

笔记

即使使用正确的cookie,如果您不发送User-Agent标头,服务器也会返回403。我不确定服务器在用户代理方面的期望,我只是复制了浏览器发送的值。

在检查是否已设置 cookie 时,最好验证您确实拥有"i10c.bdddb"cookie,而不仅仅是检查是否有任何 cookie。

这只是一个快速的示例代码,因此它不是最干净的。您可能需要查看FormUrlEncodedContent以发送页码和其他参数。

我用你的URL测试了,我能够重现你的错误。 我尝试使用查询字符串参数quantity=0的任何请求似乎都失败并显示HTTP Error 403.

我建议请求大于零的quantity

HTTP403 状态代码表示禁止,因此您的凭据存在问题。这似乎不像你在发送任何东西。如果您将它们添加到标题中,这应该可以正常工作,如下所示:

client.Headers.Add("Authorization", "token");

或像这样发送它们:

client.UseDefaultCredentials = true;
client.Credentials = new NetworkCredential("username", "password");

链接很可能是通过Web 浏览器工作的,因为您已经进行身份验证并且浏览器正在发送凭据/令牌。

我在使用 Digi-key 时也有这个问题。

我的解决方案是关闭我的VPN服务。

相关内容

  • 没有找到相关文章

最新更新