使用Java的htmlunit.WebClient和多个代理进行多线程处理

时间:2012-08-07 16:27:52

标签: java multithreading proxy webclient htmlunit

我正在使用Java和htmlunit的WebClient编写多线程刮刀。我正在使用代理池,我有一个简单的类来处理它们。它具有代理列表,您可以调用GetProxy函数来获取列表中下一个代理的IP和端口。我已经对它进行了彻底的测试,并且我已经确认它可以按预期使用任意数量的线程。

从那里我有一个getHTML函数,我可以传入一个URL和一个代理,它将为我返回页面:

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;
}

如果在代码中设置WebClients代理设置后将其写入控制台,则它似乎是正确的IP。在调试模式下单步调试也证实了这一点。但是,返回的结果HTML似乎并不反映更改的代理。

我正在使用WhatIsMyIP的自动化页面来检查我的代理以查看它们是否正常工作(http://automation.whatismyip.com/n09230945.asp)。每次我得到一个页面后,我都会编写传递给函数的代理,代理WebClient表示它在页面加载时使用,然后是HTML中返回的代理到控制台。前两个总是匹配正常,但返回的IP是关闭的。它们第一次都是正确的,但是它们似乎开始重用代理。代理并不总是在同一个线程中重用。他们似乎只选择已经存在的随机代理。

似乎代理在实际被替换之前被随机重用了一段时间,甚至跨线程。即使我设置了一个新代理,并且WebClient似乎知道我已经设置了一个新的代理,它似乎仍然使用旧代理。

那是什么造成了这种情况,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是一个框架,基本上通过htmlunit为您执行代理池上的多线程:https://github.com/subes/invesdwin-webproxy

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

相关问题