Как я уже упоминал в своем комментарии, проблема заключается в том, что сервер ожидает наличия файла 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 было бы неплохо проверить, действительно ли у вас файл cookie i10c.bdddb, вместо того, чтобы просто проверять наличие файлов cookie.
Это просто небольшой пример кода, поэтому он не самый чистый.Возможно, вы захотите заглянуть в FormUrlEncodedContent
, чтобы отправить номер страницы и другие параметры.