Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java区分站点?_Java_Web Crawler - Fatal编程技术网

如何使用Java区分站点?

如何使用Java区分站点?,java,web-crawler,Java,Web Crawler,这里我从几个不同的导航站点抓取了所有站点,其中一些是重复的,我的意思是,例如: 及 这是两个内容相同的站点,当然还有其他情况,例如缺少斜杠。通过单独使用URL,我仍然将它们视为两个不同的站点 我的问题是:有没有有效的方法将它们识别为一个站点?谢谢 据我所知,没有什么万无一失的方法可以做到这一点 话虽如此,一种方法可能是从每个URL加载内容,然后将Levenshtein距离算法应用于同一域名下的所有页面。然后,您可以设置一个阈值,在内容被视为相同之前,它的“相似性”如何(就好像内容略有变化一样,我

这里我从几个不同的导航站点抓取了所有站点,其中一些是重复的,我的意思是,例如:

这是两个内容相同的站点,当然还有其他情况,例如缺少斜杠。通过单独使用URL,我仍然将它们视为两个不同的站点


我的问题是:有没有有效的方法将它们识别为一个站点?谢谢

据我所知,没有什么万无一失的方法可以做到这一点

话虽如此,一种方法可能是从每个URL加载内容,然后将Levenshtein距离算法应用于同一域名下的所有页面。然后,您可以设置一个阈值,在内容被视为相同之前,它的“相似性”如何(就好像内容略有变化一样,我想大部分内容仍然是相同的。)大约10%的页面长度可能是该值的一个良好起点

这可能会相对缓慢,具体取决于您有多少个站点,但会考虑到每个负载上的内容略有差异,而简单的哈希或长度计算不会


为了使这一点更加可靠,您可以检查某些内容在您期望的加载中是否相同(或不相同),例如页面的标题。

使用正则表达式解析域名

示例代码段

String a = "http://www.google.com";

String tempString = a.substring(a.indexOf(".")+1, a.length()); // gets rid of everything before the first dot

String domainString = tempString.substring(0, tempString.indexOf(".")); // grabs everything before the second dot

System.out.println(domainString);
输出
google

编辑:

这里是一个示例独立演示,可以处理更复杂的域结构并提取单个组件

您可以在下面的源代码中的main方法中添加更多域测试用例,以测试各种域,但目前它正在测试以下域:

http://www.google.com/

ftp://www.google.com

http://google.com/

google.com

localhost:80

来源如下(请原谅我的懒惰意大利面):

对于上面的指定域,它输出:

Protocol: http
Subdomain: www
Domain: google
Top-Domain: com
Port: N/A

Protocol: ftp
Subdomain: www
Domain: google
Top-Domain: com
Port: N/A

Protocol: http
Subdomain: N/A
Domain: google
Top-Domain: com
Port: N/A

Protocol: N/A
Subdomain: N/A
Domain: google
Top-Domain: com
Port: N/A

Protocol: N/A
Subdomain: N/A
Domain: localhost
Top-Domain: N/A
Port: 80

最好的方法可能是使用正则表达式获取域名并保留所有域名的列表。每当你检查一个新的URL时,也要对照你的“访问”域名列表进行检查。 下面是一个关于如何获取域名的老问题:


为什么不检查两个字符串(站点名称)是否以相同的域名开头,或者是否是另一个的子字符串?您可以匹配内容长度这是两个不同的URL,而不是两个不同的站点。@它们的长度不同,这有什么帮助@sanket-内容长度在这里没有帮助…谢谢。我试着用网页的标题来做这项工作,但我不知道这是否足够。我希望有一个更简单的方法,因为你说没有万无一失的方法,我可以试试你说的方法。再次感谢!我只想区分可见内容,因为许多包含的页面内容来自JavaScript库或博客模板。有很多方法可以构建页面,但是使用Levenshtein距离算法简单地扫描内容标签就可以了。@MichaelShopsin当然,您可以通过使用一个只获取实际显示内容的库来相对轻松地改进这种方法。@berry120同意,我有一些关于网页抓取的背景知识,确定所显示的内容并不难。如果你想了解Footprint不想了解的内容,那么抓取网页是很困难的。谢谢,但我认为它不是常用的。对于一个具有三级以上域的站点,可能会有复杂的表达式。您可以放大正则表达式,给我一点时间,我将提供一个更复杂的解决方案。在这里,您可以使用类似于上面演示的内容。我所做的并没有明确定义,有时,我仍然需要从一个网站上获得几个页面,并将它们作为几个网站,如谷歌新闻和谷歌学者。但我相信它会有助于其他用途,无论如何,谢谢!
Protocol: http
Subdomain: www
Domain: google
Top-Domain: com
Port: N/A

Protocol: ftp
Subdomain: www
Domain: google
Top-Domain: com
Port: N/A

Protocol: http
Subdomain: N/A
Domain: google
Top-Domain: com
Port: N/A

Protocol: N/A
Subdomain: N/A
Domain: google
Top-Domain: com
Port: N/A

Protocol: N/A
Subdomain: N/A
Domain: localhost
Top-Domain: N/A
Port: 80