我正在使用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