我写了一个快速程序来抓取网站。但是,该网站“知道”这并非是人为袭击该网站。我认为这是因为请求几次来自同一IP地址(我正在快速测试),所以我开始使用代理,并打算轮流使用这些代理。
但是,在第二次向网站提出的请求中,我使用了一个不同的代理服务器,我从网站上收到一条回复,内容是:“我们不认为您是人类,因此请单击此处以证明您是不是机器人。”不过,有趣的是,它显示了引起问题的IP地址,而该IP地址是我自己的IP地址,而不是代理服务器的地址!
因此,即使我将代理添加到处理程序中,它似乎也被忽略了。
因此,我逐步调试了代码,检查客户端对象时,我可以清楚地看到其处理程序具有具有正确地址,端口和凭据的代理。
不知何故,好像代理不存在,每个请求都来自我自己的IP,而不是通过代理。怎么会这样?
在我的代码中,我创建一个代理:
var proxy = new WebProxy()
{
Address = new Uri($"http://{proxyHost}"),
BypassProxyOnLocal = false,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(
userName: proxyUserName,
password: proxyPassword
)
};
然后我创建一个处理程序:
var myHandler = new HttpClientHandler()
{
Proxy = proxy,
UseProxy = true
};
接下来,我创建客户端:
var client = new HttpClient(myHandler)
{
BaseAddress = new Uri(SiteAddress + "/" + methodName)
};
然后,我向客户端添加一些标题:
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
client.DefaultRequestHeaders.Add("ContentType", "application/x-www-form-urlencoded");
client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
client.DefaultRequestHeaders.Add("AcceptEncoding", "gzip,deflate,sdch");
client.DefaultRequestHeaders.Add("AcceptLanguage", "en-GB,en-US;q=0.8,en;q=0.6");
client.DefaultRequestHeaders.Add("AcceptCharset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
然后,我尝试我的请求:
try
{
var result = await client.GetAsync(urlParmString).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
return await result.Content.ReadAsStringAsync();
}
throw new Exception(result.ReasonPhrase);
}
catch (Exception)
{
return null;
}
}
因此,在这一点上,一切都按原样进行了设置(我猜是吗?),并且我希望请求使用代理。但是,一旦发出请求,它就会失败,当我查看埋在AbsolutetUri
的{{1}}中的requestUri
的{{1}}时,我看到Uri,如果我将其粘贴到浏览器中,则将我定向到一个基本上说你不是人的页面,请单击此验证码,这是有问题的IP地址。该地址是我自己的IP地址,而不是代理地址。
因此,为了确保代理没有问题,我更改了Windows设置以使用该代理并尝试浏览。系统要求我输入代理的凭据。而且有效。而且,“有效”是指我能够正常浏览,并且我的IP地址似乎是代理服务器的IP地址。
所以,我很茫然。我在设置代理/处理程序/客户端时一定做错了。我希望某人在阅读了这一冗长的冗长的句子后,可以在我做的事情上戳破洞,并告诉我我做错了什么。
编辑:我应该提到我正在为每个请求创建一个新的HttpClient。