2014-03-04 99 views
0

我一直在嘗試從hidemyass獲取代理時遇到問題。我想知道是否有人既可以告訴我,我做錯了或者給我固定的方式如下:從Java網站抓取代理?

public void loadProxies() 
{ 
    proxies.clear(); 
    String html = null; 
    String url = "http://hidemyass.com/proxy-list/"; 
    int page = 1; 
    Pattern REPLACECRAP = Pattern.compile("<(span|div) style=\"display:none\">[\\s\\d\\s]*</(span|div)>"); 
    while (page <= this.pages) { 
     status = "Scraping Proxies " + page + "/40"; 
     try { 
      html = Jsoup.connect(url + page).get().html(); 
      org.jsoup.select.Elements ele = Jsoup.parse(html).getElementsByAttributeValueMatching("class", "altshade"); 
      for (Iterator localIterator = ele.iterator(); localIterator.hasNext();) { 
       Object s = localIterator.next(); 
       org.jsoup.select.Elements ele1 = Jsoup.parse(s.toString()).children(); 
       String text = ele1.toString().substring(ele1.toString().indexOf("</span>"), ele1.toString().indexOf("<span class=\"country\"")); 
       org.jsoup.select.Elements ele2 = Jsoup.parse(text).children(); 
       Matcher matcher = REPLACECRAP.matcher(ele2.toString()); 
       String better = matcher.replaceAll(""); 
       ele2 = Jsoup.parse(better).children(); 
       String done = ele2.text(); 
       String port = done.substring(done.lastIndexOf(" ") + 1); 
       String ip = done.substring(0, done.lastIndexOf(" ")).replaceAll(" ", ""); 
       proxies.add(ip + ":" + port); 
      } 
      page++; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

這不會從該網站獲得代理的某部分,雖然這似乎是混合位一起這樣:

PROXY:98210.285995154180237.6396219.54:3128 
PROXY:58129158250.246.179237.4682139176:1080 
PROXY:5373992110205212248.8199175.88107.15141185249:8080 
PROXY:34596887144221.4.2449100134138186248.231:9000 

這些都是我運行上述代碼時得到的一些結果^。當我想要的東西PROXY:210:197:182:294:8080

任何幫助,這將不勝感激。

回答

0

解析這個網站不僅僅是在源代碼上運行正則表達式。

它的設計目的是使抓取變得困難,將隨機數據與display:none混合在一起,並找到所需的數據。

如果你想嘗試和正確地分析這一點,你需要挑選出標記爲display:inline數據以及分析這標誌着某些IDS元素inlinenone相應地對每個行之前的內聯CSS 。

此外,當網站的設計使盡可能困難的抓取時,我希望他們定期更改來源,以打破當前工作的刮板。

+0

你可能舉出一個這樣的例子。謝謝。 – user2826304

+0

如果你想走這條路,你將不得不自己去做。這樣做顯然違背了網站的意願(爲什麼他們會這麼做呢?)。他們甚至每天一次提供他們[整個數據庫]的可解析文本副本(http://hidemyass.com/proxy-list/premium/),(我認爲)是25美元的非常小的一次性成本。 – Phylogenesis

1

除非你真的想這樣做,否則考慮看看http://import.io,它提供了一個工具來解析你想要的任何東西,並將它作爲一個API導出。 您是否正在使用Java,您可以嘗試http://thuzhen.github.io/facilitator/這將幫助您快速獲取數據。

0

HideMyAss使用多種策略。儘管人們總是說「你不能用正則表達式來做!」,是的,你可以。好吧,在正則表達式的幫助下,我爲HideMyAss編寫了一個刮板,它依賴於它。 除了你採取什麼了,你需要檢查內嵌CSS一樣:

.HE8g{display:none} 
.rI6a{display:inline} 
.aHd-{display:none} 
.Ln16{display:inline} 

並刪除內聯CSS匹配顯示沒有任何元素:將被插話

<span class="HE8g">48</span> 

整個IP地址。 以及空跨度: 至於我記得有沒有空的div是你的關心,但它不會傷害,以檢查他們

有幾個陷阱,但混淆HTML是很容易預測並已有多年。

對我來說,通過針對相同的html源代碼運行並逐步刪除混淆是最容易的。

我知道這是一個古老的問題,但祝好運,任何人閱讀。