2012-08-07 304 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時,你可以做的不同。