【发布时间】:2012-05-16 10:11:27
【问题描述】:
大家好!我要编写网站爬虫,它从根地址开始,然后爬取每个找到的链接(仅限内部链接)。所以我面临这个问题: 爬虫必须从根开始,然后它应该解析网页(根页面),然后获取所有链接。在获取链接时,它不应两次抓取同一页面。各位有什么好的数据结构还是我需要使用 SQL 或其他索引数据结构?
【问题讨论】:
大家好!我要编写网站爬虫,它从根地址开始,然后爬取每个找到的链接(仅限内部链接)。所以我面临这个问题: 爬虫必须从根开始,然后它应该解析网页(根页面),然后获取所有链接。在获取链接时,它不应两次抓取同一页面。各位有什么好的数据结构还是我需要使用 SQL 或其他索引数据结构?
【问题讨论】:
您可能正在寻找的数据结构是Tree。
如果是爬虫,则不需要它,因为从根目录开始,您可以维护一个访问过的 URL 的“列表”,并且每次您要跟踪一个链接时,检查之前是否遇到过它.如果还没有遇到,则将其添加到列表中并遵循它。
虽然它不一定是一个列表(即数组),但它可以是 dictionary 或其他有助于加快搜索速度的数据结构。
它也可以是 SQL 数据库或类似 redis 的键值存储。如果您使用类似的东西,那么所有索引和查询都将由数据库系统为您处理,您可以通过标准方法(SQL、特殊 API 等)与之通信。
但是,这很容易,在“爬行”中需要考虑一些更重要的事情,也许最好先检查一下您尝试做的事情是否可以通过already available crawler 完成。
【讨论】:
我建议在这里查看我的答案:Designing a web crawler 和 How can I bring google-like recrawling in my application(web or console)
我已经回答了您提出的很多问题。要放弃的关键是爬虫使用 URL-Seen 测试来有效地确定他们是否应该爬取链接。 URL-Seen 测试通常使用快速解析键(url)的映射结构来实现。常用的解决方案有leveldb、berkeleydb等嵌入式数据库等NOSQL解决方案。
【讨论】: