发出请求时,HttpClient似乎忽略了代理

时间:2018-08-23 19:11:55

标签: c# web-scraping proxy httpclient httphandler

我写了一个快速程序来抓取网站。但是,该网站“知道”这并非是人为袭击该网站。我认为这是因为请求几次来自同一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。

0 个答案:

没有答案