我一直无法尝试从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
对此的任何帮助将不胜感激。
答案 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源来解决,并逐步删除混淆。
我知道这是一个老问题,但祝所有读书好运。