从Java网站抓取代理?

时间:2014-03-04 13:01:55

标签: java proxy

我一直无法尝试从hidemyass获取代理。我想知道是否有人能告诉我我做错了什么或给我一个解决方法:

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

对此的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

除非您真的想这样做,否则请考虑查看http://import.io,它提供了一个工具来解析您想要的任何内容并将其导出为API。 您使用的是Java吗?http://thuzhen.github.io/facilitator/可以帮助您快速获取数据。

答案 1 :(得分:0)

解析这个网站不仅仅需要在源代码上运行正则表达式。

它旨在使抓取变得困难,将随机数据与display:none混合使用您正在寻找的数据。

如果您要尝试正确解析这个问题,则需要选择标记为display:inline的数据,并在每行标记具有特定ID的元素{{1}之前解析内联CSS。 <}>或inline视情况而定。

此外,当网站设计为尽可能难以进行拼抢时,我希望他们能够定期更改源代码,从而破坏当前正在运行的刮刀。

答案 2 :(得分:0)

HideMyAss使用各种策略。尽管人们总是说“你不能用正则表达式做到这一点!”,是的,你可以。好吧,在正则表达式的帮助下,我为HideMyAss写了一个很大程度依赖它的刮刀。 除了你已经取出的东西,你需要检查内联css,如:

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

并删除内联css中与display none匹配的所有元素:

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

将在整个IP地址中插入。 以及空跨度:      据我记得,没有空洞的div值得关注,但检查它们并没有什么坏处

有一些问题,但混淆的HTML是非常可预测的,已经存在多年了。

对我来说,最简单的方法是通过运行相同的html源来解决,并逐步删除混淆。

我知道这是一个老问题,但祝所有读书好运。