云的彼端

就好像自己最喜欢的龙井,一杯香醇,久久而不散,悬坐于茗亭之中,围棋和茶,不为生活所拘谨,完美地发挥自己,那就是我的理想吧。

原创 爬虫爬取内容后的文章分析收藏

用curl或者file_getcontent的远程文件打开方式得到网页的内容后,如何分析入库?一般来说,分为三类。

第一类:偏移量法

原理很简单,跟读文件的方式差不多,将网页当作一个普通文件处理,用curl_exec存入大字符串后,在其中遍历,获得需要的信息。

优点:速度快,简单

缺点:远程文件的改变直接影响到输出结果,灵活程序不够,需要写一大堆的代码

下面的代码是几个取得偏移的辅助函数

<?php
/**
 * 取得从$start到$end的内容
 *
 * @param string $str
 * @param string $start
 * @param string $end
 * @return string
 
*/
function getValue($str, $start, $end) {
    
$pos = strpos($str, $start);
    
if($pos === falsereturn false;
    
$a = $pos + strlen($start);
    
$b = strpos($str, $end, $a);
    
if($b === falsereturn false;
    
return substr($str, $a, $b - $a);
}
/**
 * 以$pos_num为偏移量,取出$start到$end的内容
 *
 * @param string $str
 * @param string $start
 * @param string $end
 * @param int $pos_num
 * @return string
 
*/
function getPosValue($str, $start, $end,&$pos_num) {
    
$pos = strpos($str, $start,$pos_num);
    
if($pos === falsereturn false;
    
$a = $pos + strlen($start);
    
$b = strpos($str, $end, $a);
    
if($b === falsereturn false;
    
$pos_num=$b+strlen($end);
    
return substr($str, $a, $b - $a);
}
/**
 * 取得从$start到$end的内容,符合条件的最后一个内容
 *
 * @param string $str
 * @param string $start
 * @param string $end
 * @return string
 
*/
function getrValue($str, $start, $end) {
    
$pos = strpos($str, $start);
    
if($pos === falsereturn false;
    
$a = $pos + strlen($start);
    
$b = strrpos($str, $end);
    
if($b === falsereturn false;
    
return substr($str, $a, $b - $a);
}
/**
 * 以标签形式取得$start到$end的内容
 *
 * @param string $str
 * @param string $start
 * @param string $end
 * @return string
 
*/
function getLayerValue($str,$start,$end)
{
    
$pos=strpos($str,$start);
    
if($pos===falsereturn false;
    
$a = $pos + strlen($start);
    
$b = strpos($str, $end, $a);
    
if($b===falsereturn false;
    
$cont=substr($str, $a, $b - $a);
    
while(substr_count($cont,$start)!=substr_count($cont,$end))
    {
        
$b=$b+strlen($end);
        
$b=strpos($str,$end,$b);
        
$cont=substr($str, $a, $b - $a);
    }
    
return $cont;
}
/**
 * 以$pos_num为偏移,以标签形式取得$start到$end的内容
 *
 * @param string $str
 * @param string $start
 * @param string $end
 * @param int $pos_num
 * @return string
 
*/
function getLayerPosValue($str,$start,$end,&$pos_num)
{
    
$pos=strpos($str,$start,$pos_num);
    
if($pos===falsereturn false;
    
$a = $pos + strlen($start);
    
$b = strpos($str, $end, $a);
    
if($b===falsereturn false;
    
$cont=substr($str, $a, $b - $a);
    
while(substr_count($cont,$start)!=substr_count($cont,$end))
    {
        
$b=$b+strlen($end);
        
$b=strpos($str,$end,$b);
        
$cont=substr($str, $a, $b - $a);
    }
    
$pos_num=$b+strlen($end);
    
return $cont;
}
/**
 * 取得最后是$end的内容
 *
 * @param string $str
 * @param string $end
 * @return string
 
*/
function getValue1($str, $end) {
    
$pos = strpos($str, $end);
    
if($pos === falsereturn false;
    
return substr($str, 0, $pos);
}
/**
 * 取得开头是$start的内容
 *
 * @param string $str
 * @param string $start
 * @return string
 
*/
function getValue2($str, $start) {
    
$pos = strpos($str, $start);
    
if($pos === falsereturn false;
    
return substr($str, $pos + strlen($start));
}
/**
 * 以$pos_num为偏移量,取得开头是$start的内容
 * @param string $str
 * @param string $start
 * @param int $pos_num
 * @return string
 
*/
function getPosValue2($str, $start,&$pos_num) {
    
$pos = strpos($str, $start,$pos_num);
    
if($pos === falsereturn false;
    
$pos_num+=strlen($start);
    
return substr($str, $pos + strlen($start));
}
?>

第二类:正则表达式法

正则方法容易理解,用preg_grep函数或者别的方法来取得值,也是最常用的方法

优点:速度较快,代码很少,适应力很不错。

缺点:写正则很麻烦,尤其是适用范围较广的网页正则

第三类:DomTree方式 

Domtree的意思就是,将html页面分析为DOM,然后利用Dom的方式来获取。

优点:适应力好

缺点:对于Dhtml的页面或者全部使用样式表进行处理的页面非常有效,但对传统的table方式就起不了太大作用了。

类库:PHP跟C++跟JAVA都有相应的类库处理,一般过程是:

使用Tidy来格式化页面后,再使用HtmlParser库进行读取。

发表于 @ 2007年01月07日 13:53:00|评论(loading...)

新一篇: 观公司缓冲服务器有感 | 旧一篇: CURL库的一些用法总结(爬站...)

Csdn Blog version 3.1a
Copyright © leftatrium