【问题标题】:When crawling a page, how to get full URL from <a href> or <frame src> attributes爬取页面时,如何从 <a href> 或 <frame src> 属性获取完整 URL
【发布时间】:2011-09-18 02:24:45
【问题描述】:

我实际上使用的是 PHP,但是这种爬取可以通过任何编程语言来完成。要适应很多情况会有点困难。请帮我看看问题,请给我一些建议,看看我是否走对了方向。

我所知道的是当前的 url 地址,我可以从中获取来自 &lt;a href=" 或来自 &lt;frame src=" 的链接列表。

我在做的是:从当前的url地址,我可以先得到root url,比如从http://www.abc.com/def,我可以先得到http://www.abc.com。这是为了迎合&lt;a href="/fff.html"的情况,所以我得先知道root url。

其次,我需要从当前 url 中获取 url 目录,这有点困难,我仍然不知道如何完美地完成它。比如http://www.abc.com/def/xyz.htm,它的url目录是http://www.abc.com/def。这是为了迎合&lt;a href="../../xyz.html"&gt;的情况。

我面临的问题是,如何获取当前的url目录?例如,如果当前 url 是http://www.abc.com/def,我怎么知道 def 是目录还是文件呢?如果 def 是一个文件,那么 url 目录就是http://www.abc.com。但是如果 def 是一个目录,那么 url 目录就是http://www.abc.com/def

你可以说,如果最后有“/”,那就是目录。但从我的角度来看,当我抓取网页时,我并不能真正确保网页构建器会在目录 url 的末尾添加“/”。目录 url 是完全有效的,例如,如果 def 是一个目录,那么 http://www.abc.com/def 可能代表 http://www.abc.com/def/index.html

由于很难知道http://www.abc.com/def是目录还是脚本文件,所以很难从&lt;a href="xyz.html"&gt;等相对href制作完整的url。

我是不是把问题复杂化了?有什么解决办法吗?

还有其他情况,例如 href="# 表示锚点,然后我将其附加到当前 url 的末尾。这对于任何当前 url 情况是否正确且有效?意思是,这对于以下情况是否有效当前url是http://www.abc.com/def(def是一个目录),http://www.abc.com/def#xyz会被转换成http://www.abc.com/def/index.html#xyz吗?

对于 href="javascript: 或 href="vbscript: 等,我将忽略它。

对于 href="xyz.???",如果 ???是图像文件、exe 文件或任何无效的 html 文件,我会忽略它们吗?

谢谢。

这个问题可能有点乱,希望我解释清楚。

【问题讨论】:

  • +1 问题的格式和表述都很好!另外,不要忘记&lt;img src="..."&gt;
  • 仅仅因为这可以适用于任何编程语言并不意味着你应该添加编程语言标签,它可能意味着你不应该添加任何。我已经删除了python,因为你的选择似乎是任意的,但是因为你说这就是你实际工作的原因,所以离开了 PHP。
  • 您好,抱歉,我添加了流行语言标签,因为我认为这会让更多可能理解问题的人看到问题。
  • 你不应该添加标签,除非它确实相关,但它确实有效——我们回答的主要是 Python 人。

标签: php python web-crawler


【解决方案1】:

域名之后的任何内容都可以映射到配置域的人想要的任何内容。

不能保证以 .html 结尾的 URL 引用某个文件系统上的真实文件,或者它会返回有效的 HTML 或其他任何内容。

您可以任意决定将def/ 计为目录或文件名的一部分,无论您喜欢什么,因为任何选择都同样正确。

【讨论】:

  • 嗨,谢谢,这真的提醒我,我可能会将任何事情都视为相同,即使是abc.com/xyz.jpg。我将尝试读取文件的标题部分并查看它是否是有效的 html,如果是,我将需要使用一些测试来查看它是目录还是文件。
  • 要查看某个内容是否为图像、可执行文件等,请使用content-type header
【解决方案2】:

如果http://www.abc.com/def 是一个目录,那么Web 服务器通常会重定向到http://www.abc.com/def/ 以避免混淆客户端。您只需要注意重定向并使用 urlparse.urljoin() 中的适当函数将两个组件融合在一起,就像浏览器一样。

【讨论】:

  • 嗨,谢谢,目前我使用 file_get_contents 获取当前链接内容,并使用 fopen 和 read until 快速抓取标题和元数据。有没有办法知道使用 PHP 的重定向?我会尝试这个解决方案,稍后再回来。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多