当前位置: 首页 >> 程序设计 >> 爬虫爬取内容后的文章分析
 

爬虫爬取内容后的文章分析

作者:      来源:http://blog.csdn.net/leftatrium     发表时间:2007-01-07     浏览次数:      字号:    

用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库进行读取。

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •