HttpClient - 返回的浏览器内容不同
问题描述:
我试图向kicksusa.com发出请求。如果我从任何浏览器发出请求,我会得到完整的HTML,但是,我似乎无法以返回相同HTML的方式来模拟请求,而是得到'请求失败'。信息。HttpClient - 返回的浏览器内容不同
任何帮助表示赞赏
我的代码:
HttpClientHandler httpClientHandler = new HttpClientHandler()
{
//Proxy = proxy,
AllowAutoRedirect = true,
MaxAutomaticRedirections = 15,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.None
};
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Host", "www.kicksusa.com");
client.DefaultRequestHeaders.Add("Connection", "keep-alive");
client.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36");
client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, sdch");
client.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6");
var _response = await client.GetAsync("http://www.kicksusa.com/jordan-craig/oil-stain-slub-tee-army-green-8909ag.html");
if (_response.IsSuccessStatusCode)
{
var _html = await _response.Content.ReadAsStringAsync();
}
提琴手道头:
Host: www.kicksusa.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
答
本网站使用一些专用技术,从Incapsula防止自动访问该网站。
在第一次请求时,站点返回一个带有嵌入式iframe的web文档。只有当iframe源被加载后,cookie才会被设置,并发生重定向到页面。所有进一步的请求将立即成功,因为浏览器发送cookie信息。
为了规避此机制,您必须在第一次请求后加载iframe,记住该cookie,然后发送所有进一步请求的cookie。第一个答案中还包含很多JavaScript代码,可能必须执行Incapsula检查以取得成功。
但是,当网站专门使用这种技术来阻止自动访问其内容时,任何绕过此机制的企图都必须被视为不受欢迎的并且是一种犯罪行为。您不应该尝试自动从未经所有者批准的站点收集数据,特别是当使用Incapusla等技术来使这变得更加困难时。
另请参阅Incapsula员工的this answer了解更多详情。
使用Fiddler,并将每个请求作为序列化的线索进行比较。 – Amy
我已经完成了这项工作 - 仍然没有运气,请参阅编辑 –
该网站无论如何都使用javascript加载所有内容,因此即使您管理得到的是类似于浏览器的确切响应,它也不会对您有太大帮助,因为它不会包含任何内容有用的信息(只是一个通知,你必须启用JavaScript)。您需要渲染该网站(使用CefSharp.OffScreen或其他用于此目的的工具)执行它的JavaScript。 – Evk