我正在使用Java和htmlunit的WebClient编写多线程的刮板。我正在使用一个代理池,我有一个简单的类来处理它们。它具有代理列表,您可以调用GetProxy函数来获取列表中下一个代理的IP和端口。我已经对它进行了彻底的测试,并且我已经确认它可以按照任意数量的线程工作。使用Java的htmlunit.WebClient和多个代理进行多线程
从那里我有一个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关闭。他们第一次都会是正确的,但是他们似乎开始重用代理。代理并不总是在同一个线程中被重用。他们似乎只是选择一个已经存在的随机代理。
似乎代理会在实际更换之前随机重复使用一段时间,即使是跨线程也是如此。尽管我设置了一个新的代理,并且WebClient似乎知道我已经设置了一个新的代理,但似乎仍然使用旧代理。
那么是什么原因造成的,我该如何解决这个问题?
即使在多线程环境下,代码对我来说也很好。如果您认为HtmlUnit 2.9或2.10中有某种错误(您没有指定),请确保在单线程环境中测试它,如果测试仍然失败,请报告错误。 – 2012-08-07 20:37:36
@Mosty Mostacho当我发布这个时,我使用了2.9,但是我升级到了2.10,而且我仍然遇到同样的问题。我不确定这是缓存问题还是其他问题。我使用数据包嗅探器来确认我实际上使用的是正确的代理服务器。所以我不知道为什么同一个页面连续多次返回,特别是当我每次创建一个WebClient的新实例时。我还尝试在每次使用前清除我的Cookie和缓存,但它似乎仍然无法正常工作。 – 2012-08-08 19:55:39