PHP 中的网络爬虫链接/页面逻辑

发布于 2024-07-09 12:28:24 字数 490 浏览 6 评论 0原文

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

它所做的只是使用 get_file_contents 获取网页内容,并使用正则表达式获取所有链接 DESCRIPTION -在它返回的那一刻:

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

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

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

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

I'm writing a basic crawler that simply caches pages with PHP.

All it does is use get_file_contents to get contents of a webpage and regex to get all the links out <a href="URL">DESCRIPTION</a> - at the moment it returns:

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

The problem I'm having is figuring out the logic behind determining whether the page link is local or sussing out whether it may be in a completely different local directory.

It could be any number of combinations: i.e. href="../folder/folder2/blah/page.html" or href="google.com" or href="page.html" - the possibilities are endless.

What would be the correct algorithm to approach this? I don't want to lose any data that could be important.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

空‖城人不在 2024-07-16 12:28:24

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

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

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

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

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

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

First of all, regex and HTML don't mix. Use:

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

Links that may go outside your site start with protocol or //, i.e.

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

href="google.com" is link to a local file.

But if you want to create static copy of a site, why not just use wget?

无人问我粥可暖 2024-07-16 12:28:24

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

它们可以是:

  • 没有方案且没有主机相对,或者
  • 具有“http”方案的绝对或“https”和一个主机
    与来自的机器相匹配
    脚本正在运行

这就是识别链接是否本地所需的全部逻辑。

使用 parse_url 函数分离 URL 的不同组成部分以识别 < em>方案和主机

Let's first consider the properties of local links.

These will either be:

  • relative with no scheme and no host, or
  • absolute with a scheme of 'http' or 'https' and a host that
    matches the machine from which the
    script is running

That's all the logic you'd need to identify if a link is local.

Use the parse_url function to separate out the different components of a URL to identify the scheme and host.

蓝色星空 2024-07-16 12:28:24

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

You would have to look for http:// in the href. Else, you could determine if it starts with ./ or any combination of "./". If you don't find a "/" then you would have to assume that its a file. Would you like a script for this?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文