最近在做一个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 有意义的代码, 有意义的学习
标签: , , , ,


随机文章
  • 就叫水立方吧 2008年7月19日
  • 看了桃花运,感觉有点晕 2008年12月11日
  • 又是情人节 2008年8月6日
  • Reed Exhibitions年会 流水不报账 2010年2月5日
  • 08回顾系列三<什么最贵> 2008年12月28日
  • 87.53% 2009年12月11日
  • 3个空瓶可以换1瓶汽水的问题<商业数字的游戏> 2009年9月7日
  • 搜索引擎的公正性 2009年11月18日
  • 谈谈绿坝,谈谈网络 2009年6月12日
  • 火车票 2009年1月15日
  • 没有留言 to “利用Dom抓取网页中所有链接(PHP)”

    留言

    有意义的声明

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

    最近的日志

    订阅有意义的内容