0

我希望有人可以帮助我解决这个问题。我正在用 PHP 编写一个蜘蛛应用程序,它编译来自域的唯一 URL 列表,处理每个唯一 URL 上的 HTML 数据,然后生成有关这些页面的统计数据。

我的问题与知道我爬取的 URL 是否对我的列表真正唯一有关,更具体地说,当参数值不同时。

例如,以下是我的蜘蛛收集的两个 URL,它们在技术上是唯一的('replytocom' 的参数值不同),但也直接指向同一页面:

这些链接是您在博客上可以找到的那种链接,可以更轻松地回复特定评论,同时仍使用相同的回复表单。这就是我的问题所在:它们都是同一页面的 URL,这是我不想重新处理的数据(我真的只想要原始页面的 URL 进行处理)。对于在所有评论部分使用此类链接的博客,这对我的蜘蛛来说将是一个大数据问题。

我的问题是:有没有办法判断两个具有不同参数值的链接是否引用同一页面?让我想知道的是,例如,具有不同参数值的 YouTube 视频确实意味着不同的页面。除了自己打开页面并检查之外,是否有一种编程方式来判断两个 URL 是否正在加载同一个页面?

我真的很感激这方面的任何帮助!

4

4 回答 4

2

网页应该包含<meta rel="canonical">标签来为您回答这个问题。
如果存在,这将指定此页面的“官方”URL;对于同一页面的不同 URL,它应该是相同的。

如果没有这个标签,那你就不走运了。

于 2013-08-05T15:21:29.050 回答
1

不,没有办法说。参数(在 之后?和之前#)被传递给 Web 服务器,这取决于 Web 服务器对它们的作用,以及它们是否影响返回的页面。

(后面的#部分不提供给服务器,不会影响服务器返回的 HTML,但可能会被 JavaScript 用来修改用户看到的页面。)

于 2013-08-05T15:15:19.083 回答
0

不,即使使用您的示例,页面也正在更改,以便表单识别您点击回复的人。

?网络服务器可以使用您在请求中传递的参数(之后和之前的项目)做它喜欢的事情#

后面的字符串#表示浏览器应该滚动到的页面上的锚点。

于 2013-08-05T15:16:03.697 回答
0

这应该工作

function PagesAreIdentical($pointer1, $pointer2) {
    $headerArray1 = get_headers($pointer1);
    $headerArray2 = get_headers($pointer2):
    if($headerArray1['Content-Length'] == $headerArray2['Content-Length'])
    {
        if(file_get_contents($pointer1) != file_get_contents($pointer2))
            return false;
        else
            return true;
    }

    else return false;
}
于 2013-08-05T16:14:08.780 回答