在Java中存储web爬虫URI的最佳高效数据结构

在Java中存储web爬虫URI的最佳高效数据结构,java,database,data-structures,web-crawler,Java,Database,Data Structures,Web Crawler,我正在构建一个网络爬虫,我已经实现了解析部分。现在我想将获得的URI存储到一个高效的数据结构中。我应该用什么??我正在使用Jena库进行解析。哈希 例如:URL:scheme://domain:port/path?query_string#fragment_id. 将URL解析为字符串后,将URL存储为: 散列['scheme']=方案 散列['domain']=域 散列['port']=端口 散列['path']=path 散列['query\u string']=query\u string

我正在构建一个网络爬虫,我已经实现了解析部分。现在我想将获得的URI存储到一个高效的数据结构中。我应该用什么??我正在使用Jena库进行解析。

哈希

例如:URL:scheme://domain:port/path?query_string#fragment_id.

将URL解析为字符串后,将URL存储为:

散列['scheme']=方案

散列['domain']=域

散列['port']=端口

散列['path']=path

散列['query\u string']=query\u string


散列['fragment\u id']=fragment\u id

我猜您想自动丢弃重复项,这样就不会对URI进行两次爬网?那么,我建议一个新的方案


它会自动丢弃重复项,并且在最佳情况下插入复杂性仍然保持不变。请注意,当您使用自己的类来表示URI而不是默认类时,必须重写URI类的方法以返回URI字符串的基于文本的哈希。Object的默认方法为每个对象创建唯一的哈希代码,即使内容相同。

爬虫程序通常使用
队列
保留待检查URI,并附带
集合
,以检查重复,然后将URI插入上述队列,并在检查后将URI放入集合


如果链接的数量可以放入内存中,那么您可以将
链接列表
作为队列,将
哈希集
作为集合。否则,您可以同时使用外部数据库或队列服务器(如ActiveMQ)作为队列和数据库集。

我将在Redis中存储要处理的URI队列和已处理的URI队列(http://redis.io/). Redis是一种非常快速的半持久性键值存储,本机支持各种数据结构,包括列表(URI队列)和哈希(映射)。这样,这些数据结构将在Java应用程序重新启动后继续存在。您还可以运行多个应用程序实例,而不需要通过Redis进行太多通信。

通常在web爬网应用程序中,您需要管理要丢弃的url(有时称为“黑洞”)、放弃对同一页面的频繁访问,以及将url用作页面内容的全局标识符

但另一个有趣的时刻是,放弃两次访问相同的URL是错误的(,因为网页内容可能会随着时间的推移而改变)

因此,满足这些要求的最佳方法是使用某种优先级队列,并将每个url与元组关联:{url,哈希(url)}。当您得到新的url时,只需计算其哈希值,如果您的数据库记录中有相同的哈希值,只需将此url设置为低优先级,并将其放入优先级队列

Web爬虫请求url访问的优先级队列。因此,只有具有最高优先级URL的页面才会被主要访问


您可以构建自己的哈希函数,以最佳方式满足您的需要(例如,从url字符串中删除参数,并从字符串的其余部分计算哈希)。

一个“高效”的数据结构?效率如何?您有一个URI列表。有多少您需要如何访问它们?列表有什么问题?为什么不使用标准的
java.net.URI
,它已经定义了自己的
equals
hashCode
实现?我还想将一个值与集合或HashSet的每个元素相关联,如果可能的话??在这种情况下,您需要一个HashMap。这是一个存储键/值对的数据结构。键可以是URL和任何存储URL信息的对象的值。嘿..Philipp我已经阅读了Hash Map的Java文档,我认为它确实提供了动态增加特定密钥值的选项。我需要这个键的动态增值功能。谢谢。我还想将一个值与集合中的每个元素相关联,如果可能的话??这意味着我必须建立一个哈希映射的优先级队列(以存储元组{url,哈希(url)})。@Prannoy Mittal,不。我只描述了一个概念。我的意思是你必须在你的存储中同时存储:哈希和url(例如,如果是关系数据库-只需为url和哈希设置两列,也可以为列添加索引,因为您将通过哈希比较url)。因此,如果您得到一些url:-首先计算其哈希,其次-检查存储中是否存在此类哈希。如果存在-设置低优先级(如果不存在-设置高优先级)-并将此url添加到队列中。如果将所有这些url存储在redis中,您将很快耗尽内存。否?