最近在做一个url缩写的服务,当然这个功能只是内部使用,并不对外开放;

研究用正则对页面的URL进行抓取后再对URL进行处理,但发觉无论多么NB的正则,都无法很好的把整个页面的URL给抓取下来;
主要存在以下几个问题:
1,处理特殊符号不当,如单引号,双引号,尖括号,”@”"&”符号;
2,处理https,ftp,带有端口号的url(http://www.site.com:8000)等特殊的url遇到错误;
3,会把诸如img标签,甚至background-image的文件也当成url给抓取下来;
4,越完美的抓取正则,执行效率就越让人崩溃,加上网络延迟,抓取门户网站首页链接,让我有种想砸键盘的冲动;

于是只得另觅它法;
在发文前,已找到了一个相对比较完美的方法,那就是用PHP自带的Dom Extension;
Dom Extension功能在PHP5.0以上是自带且默认开启的,所以不用做任何配置;

下面是实现代码(绿色),很简单,而且执行效率很高,至于容错性嘛,至今我未发现有错误;
//获得HTML源代码
$html = file_get_contents(”http://www.sina.com.cn/”);
//用DOM加载HTML源代码
$dom = new DOMDocument();
@$dom->loadHTML($html);
//抓取页面URL
$xpath = new DOMXPath($dom);
//查找A节点
$hrefs = $xpath->evaluate(”/html/body//a”);
for ($i = 0; $i < $hrefs->length; $i++){
$href = $hrefs->item($i);
//获得href属性值
$url = $href->getAttribute(’href’);
echo $url.”<br />\n”; //打印url
}

很简单,最终测试结果,抓取sina首页url的总时间为219毫秒,Kuuuuul~。

Published in 有意义的代码, 有意义的学习
标签: , , , ,


随机文章
  • 爱呼II,哀呼啊 2008年12月19日
  • 旱灾的思考 2009年2月19日
  • 吴琪华印 2008年7月21日
  • 最近很火的加薪问题<商业数字的游戏> 2010年5月10日
  • 只为了你 2009年5月15日
  • 简单实用的效果 2008年7月22日
  • 量子危机 2008年11月18日
  • Apache2.2的Rewrite 2008年12月25日
  • Nokia N80 2008年10月12日
  • 做俯卧撑 2008年7月8日
  • 没有留言 to “利用Dom抓取网页中所有链接(PHP)”

    留言

    有意义的声明

    我的Blog我做主,我的Blog不客观
    如果您要求客观,建议您去CCTV
    如果您要求官方,建议您去人民网
    我用我的键盘敲出我想法,
    所以请你用自己的脑袋和眼睛来阅读,
    如有误导,概不负责。

    最近的日志

    订阅有意义的内容