【问题标题】:Best practices for using URL as a database key使用 URL 作为数据库键的最佳实践
【发布时间】:2011-04-12 23:15:54
【问题描述】:
我将编写一个爬虫,将结果存储在数据库 (MongoDB) 中。
当然,使用 URL 作为一种可能的查询参数很重要。但是,这也有问题:
- URL 可以很长,而 MongDB 的最大密钥长度是有限的
- 内容同义词有很多,仅爬取一页您就不会知道这一点。
- HTTP 301、302、303、307 等如何处理。存储原始 URL 还是新位置?对于链接缩短器来说,这尤其是一个问题。
- “最后一个.fm”问题。 lastfm.com == last.fm ~= lastfm.it (等等)并且该站点不使用 30x 结果代码来表示。它只提供来自多个域的内容。
此数据库的目标:
- 给定任何可能存在或不存在于数据库中的 URL,让我查询以了解我之前是否以合理的准确性抓取过该文档。
当然,除了“只是去抓取它并存储确切的 URL 而不必担心重复”之外的任何方案都会有一些误报。误报是我认为与之前抓取的 URL 相同但实际上不同的 URL。
【问题讨论】:
标签:
http
database-design
url
url-shortener
【解决方案1】:
我认为默认情况下,您的密钥可以是 1000 字节。你真的会有比这更大的网址吗?最糟糕的是,我很确定这是一个可以更改的硬编码常量。
关于你的其他观点:
有很多内容同义词,你只爬一页是不知道的。
- 嗯?您的意思是说一个网站可能是重复的,只有围绕关键短语的内容存在细微差别,而您希望避免将这些内容编入索引?
HTTP 301、302、303、307 等如何处理。存储原始 URL 还是新位置?对于链接缩短器来说,这尤其是一个问题。
- 我认为目的地......如果有人多次缩短同一个目的地怎么办?如果缩短的链接过期,或者缩短器下线怎么办?我认为这些比目标网址发生的同样事情更有可能发生。
“The last.fm”问题。 lastfm.com == last.fm ~= lastfm.it (等等)并且该站点不使用 30x 结果代码来表示。它只提供来自多个域的内容。
- 你能写一个简单的算法来检查可能相似的域吗? Last.fm 包含 lastfm.com 的 6/9 个字符,并且前 6 个字符是相同的。如果您还要存储一些元数据,您可以检查具有高度相关性的匹配是否可能是相同的文档。
给定任何可能在数据库中或不在数据库中的 URL,让我查询一下我之前是否曾以合理的准确性抓取过该文档。
- 见最后一点
希望这会有所帮助!