1

我正在编写一个基本的爬虫,它只是用 PHP 缓存页面。

它所做的只是get_file_contents用来获取网页的内容和正则表达式来获取所有链接<a href="URL">DESCRIPTION</a>- 在它返回的那一刻:

Array {
[url] => URL
[desc] => DESCRIPTION
}

我遇到的问题是弄清楚确定页面链接是否是本地的或是否可能位于完全不同的本地目录中的逻辑。

它可以是任意数量的组合:即href="../folder/folder2/blah/page.html"href="google.com"href="page.html"- 可能性是无穷无尽的。

解决这个问题的正确算法是什么?我不想丢失任何可能很重要的数据。

4

3 回答 3

3

首先,正则表达式和 HTML 不能混用。采用:

foreach(DOMDocument::loadHTML($source)->getElementsByTagName('a') as $a)
{
  $a->getAttribute('href');
}

可能超出您网站的链接以协议或开头//,即

http://example.com
//example.com/

href="google.com"是指向本地文件的链接。

但是,如果您想创建站点的静态副本,为什么不使用wget?

于 2008-12-11T22:55:02.690 回答
1

让我们首先考虑本地链接的属性。

这些将是:

  • 没有计划也没有主人的亲戚,或
  • 绝对的,带有“http”或“https”的方案以及与运行脚本的机器相匹配的主机

这就是您需要确定链接是否为本地的所有逻辑。

使用parse_url函数分离出 URL 的不同组成部分,以识别方案主机

于 2008-12-15T19:16:14.613 回答
0

您必须在 href 中查找 http://。否则,您可以确定它是否以 ./ 或“./”的任何组合开头。如果您没有找到“/”,那么您将不得不假设它是一个文件。你想要一个脚本吗?

于 2008-12-12T01:38:59.580 回答