2010-06-20 114 views
0
的,我这样做是为网络爬虫(又名蜘蛛又名虫...)

规范化的URI部分

给定两个字符串(基本URL和相对URL),我需要

第一确定绝对网址。 这是特别令人困惑,当谈到“搜索引擎友好”的废话,比如:

基地网址:http://aaa.com/january/15/test 找到的网址:/test.php?aaa

我怎么会知道,上述不或不是?例如: 例如;绝对路径将是:

http://aaa.com/january/15/test/test.php?aaa

或者:

http://aaa.com/january/15/test.php?aaa

混淆源于是否有索引在行动或没有。 “/test/index.php”还是“/index.php”?

+1

我认为a *蠕虫*有些不同;) – 2010-06-20 12:47:56

+0

http://en.wikipedia.org/wiki/Web_crawler#cite_ref-36 也许是一个老派的名字? – Christian 2010-06-20 12:52:24

+0

好吧,这似乎是指以这种方式命名的实际应用程序。术语*蠕虫*通常是指某种类型的恶意软件。但我不想争辩,我只是注意到它;) – 2010-06-20 12:59:53

回答

1

您不能通过检查URL来解决此问题。

你说你需要给定一个基本URL和相对URL的绝对URL。完整的URL是基本URL和相对URL的串联。正如你所看到的,知道这一点并没有帮助。

http://example.com/directory/index.phphttp://example.com/directory/可以合法地引用两个不同的资源。

http://example.com/directory/index.phphttp://example.com/directory/foo/bar/baz.php可以合法地引用相同的最终资源。

在上面的第二个示例中,哪个是规范URL?这不是必须通过计算确定的事情。规范URL是您选择作为规范URL的那个URL。

你实际上是在这里面临两个问题:

  1. 什么时候两个不同的URL指向相同的资源?
  2. 哪个URL是规范URL?

1.当两个不同的URL引用相同的资源时?

这不能通过以任何方式比较URL来确定。这只能通过比较资源本身即内容和HTTP头来确定。

的ETag - http://en.wikipedia.org/wiki/HTTP_ETag

总之,ETag的是HTTP标头为资源唯一的。其意图是用于高速缓存验证,即我在缓存中的内容是否与http://example.com/content的内容相同?

两个相同的资源,至少来自同一个主机,将具有相同的ETag标头值。如果可能的话使用它(不是所有的web服务器都会返回一个ETag头)。

HTTP报头和内容比较

当两个资源相同?内容类型和内容相同时。

使用Content-Type标头比较内容类型。比较内容本身就是字符串比较的一个简单例子。

如果您正在存储先前找到的资源的属性并将它们与新发现的资源进行比较,则不需要考虑用于比较的资源的全文 - 散列就可以。

就PHP而言,HTTP extension将为您提供所有需要的非常方便的OO API,用于检查资源的HTTP标头和完整内容。 md5()函数是生成唯一散列的一个选项。还有其他人。

2.哪个URL是规范URL?

挑一个,坚持下去。默认情况下,对于同一资源,一个URL不会比另一个更规范。为了简单起见,你可以考虑两个URL中最短的一个是规范形式。

+0

非常有用的帖子,但是,如何正确地连接2个部分而不会首先生成大量的404? – Christian 2010-06-20 17:32:27

+0

@Christian:我明白了,我并没有完全明白你的问题。基本网址:http://aaa.com/january/15/test找到网址:/test.php?aaa =>绝对网址:http://aaa.com/test.php ?aaa – 2010-06-20 21:41:59