我用Java编写的HtmlUnit和的Web客户端多线程刮刀。 我使用代理服务器池,我有一个简单的类来处理它们。 它具有代理服务器列表,并调用一个GetProxy函数来获取列表中的下一个代理服务器的IP和端口。 我已经彻底的测试它,我已经证实,它正在按照预期与任意数量的线程。
从那里,我有一个getHTML功能,我可以在一个网址和一个代理通过,它将返回页面对我来说:
public String getHTML(String URL, ProxyData pData)
{
WebClient webClient = new WebClient();
String pageAsXml = "";
webClient.setJavaScriptEnabled(false);
ProxyConfig pConf = new ProxyConfig(pData._host, pData._port);
webClient.setProxyConfig(pConf);
try
{
HtmlPage page = webClient.getPage(URL);
pageAsXml = page.asXml();
}
catch (FailingHttpStatusCodeException e)
{
e.printStackTrace();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
webClient.closeAllWindows();
return pageAsXml;
}
如果我写的Web客户代理设置控制台在代码中设置这些之后,这似乎是正确的IP。 通过在调试模式下步进也证实了这一点。 然而,由此产生的HTML返回似乎并没有反映更改代理。
我使用WhatIsMyIP的自动化页面来检查我的代理,看看他们的工作(http://automation.whatismyip.com/n09230945.asp)。 每次我得到一个网页我写我传递给函数的代理时间后,代理WebClient的说,这是用在页面加载的时间,那么这是在HTML返回到控制台代理。 前两个总是一致的罚款,但返回的IP是关闭的。 他们都将是正确的第一次,但后来他们似乎开始重新使用代理服务器。 而代理并不总是得到相同的线程中重复使用。 他们似乎只是选择一个已经存在的随机代理。
这似乎是代理甚至得到跨线程随机重复使用了一段时间实际上是取代之前他们。 即使我设置一个新的代理,以及Web客户端似乎知道我已成立一个新的代理,它似乎仍然使用旧的。
那么是什么原因造成这一点,我怎么围绕它得到什么?