爬取页面时如何从<a href>或<frame src>属性获取完整URL
其实我在用PHP,但这种抓取网页的工作可以用任何编程语言来做。处理很多情况会有点困难。请帮我看看这个问题,并给我一些建议,看看我是不是在正确的方向上。
我知道的是,从当前的网页地址可以获取到一些链接,比如从 <a href="
或者 <frame src="
中提取。
我现在做的是:从当前的网页地址出发,首先获取根网址,比如从 http://www.abc.com/def,我可以先得到 http://www.abc.com。这样做是为了处理像 <a href="/fff.html"
这种情况,所以我必须先知道根网址。
其次,我需要从当前网址获取目录,这个有点难,我还没找到完美的解决办法。比如,从 http://www.abc.com/def/xyz.htm,它的目录是 http://www.abc.com/def。这样做是为了处理像 <a href="../../xyz.html">
这种情况。
我现在面临的问题是,如何获取当前网址的目录?比如,如果当前网址是 http://www.abc.com/def,我怎么知道 def 是一个目录还是一个文件?如果 def 是一个文件,那么网址的目录就是 http://www.abc.com。但如果 def 是一个目录,那么网址的目录就是 http://www.abc.com/def。
你可以说如果最后有一个“/”,那么它就是一个目录。但从我的角度来看,当我在抓取一个网页时,我不能保证网页的创建者会在目录网址的末尾加上“/”。一个目录的网址是完全有效的,比如,如果 def 是一个目录,那么 http://www.abc.com/def 可能代表的是 http://www.abc.com/def/index.html。
由于很难判断 http://www.abc.com/def 是一个目录还是一个脚本文件,所以从相对链接生成完整网址,比如 <a href="xyz.html">
,就变得很困难。
我是不是把问题搞得太复杂了?有没有什么解决办法?
还有其他情况,比如 href="#" 表示锚点,那我就把它加到当前网址的末尾。这种做法对任何当前网址的情况都正确有效吗?也就是说,在当前网址是 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 的东西,我也会忽略它们吗?
谢谢。
这个问题可能有点乱,希望我解释得清楚。
2 个回答
如果 http://www.abc.com/def
是一个目录,那么网络服务器通常会把你引导到 http://www.abc.com/def/
,这样做是为了避免让用户感到困惑。你只需要注意到这个跳转,然后使用 urlparse.urljoin()
或者你选择的编程语言中的相应函数,把这两个部分合并在一起,就像浏览器那样处理。
在域名后面的任何内容都可以根据配置域名的人想要的方式进行设置。
没有任何保证说以 .html
结尾的链接一定指向某个真实的文件,或者它会返回有效的HTML,或者其他任何东西。
你可以随意决定把 def/
当作一个目录,或者当作文件名的一部分,怎么方便怎么来,因为任何选择都是正确的。