PHP 中的网络爬虫链接/页面逻辑
我正在编写一个基本的爬虫,它只是使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先,正则表达式和 HTML 不能混合。 使用:
可能超出您网站的链接以协议或
//
开头,即href="google.com"
是指向本地文件的链接。但如果您想创建站点的静态副本,为什么不直接使用
wget
呢?First of all, regex and HTML don't mix. Use:
Links that may go outside your site start with protocol or
//
, i.e.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
?我们首先考虑本地链接的属性。
它们可以是:
与来自的机器相匹配
脚本正在运行
这就是识别链接是否本地所需的全部逻辑。
使用 parse_url 函数分离 URL 的不同组成部分以识别 < em>方案和主机。
Let's first consider the properties of local links.
These will either be:
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.
您必须在 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?