2010-06-20 83 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