最近在做一个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~。