2012-08-07 305 views
1

我正在使用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似乎知道我已经设置了一个新的代理,但似乎仍然使用旧代理。

那么是什么原因造成的,我该如何解决这个问题?

+0

即使在多线程环境下,代码对我来说也很好。如果您认为HtmlUnit 2.9或2.10中有某种错误(您没有指定),请确保在单线程环境中测试它,如果测试仍然失败,请报告错误。 – 2012-08-07 20:37:36

+0

@Mosty Mostacho当我发布这个时,我使用了2.9,但是我升级到了2.10,而且我仍然遇到同样的问题。我不确定这是缓存问题还是其他问题。我使用数据包嗅探器来确认我实际上使用的是正确的代理服务器。所以我不知道为什么同一个页面连续多次返回,特别是当我每次创建一个WebClient的新实例时。我还尝试在每次使用前清除我的Cookie和缓存,但它似乎仍然无法正常工作。 – 2012-08-08 19:55:39

回答

0

这里的框架通过该的HtmlUnit本质上是做多线程在代理池为你:https://github.com/subes/invesdwin-webproxy

这也解决了其他问题,如htmlunits JavaScript分析器耗尽CPU和其他问题的实例太多。也许代码可以给你一个暗示,当你在自己的框架中以这种方式使用htmlunit时,你可以做的不同。