用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 === false) return false;
$a = $pos + strlen($start);
$b = strpos($str, $end, $a);
if($b === false) return 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 === false) return false;
$a = $pos + strlen($start);
$b = strpos($str, $end, $a);
if($b === false) return 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 === false) return false;
$a = $pos + strlen($start);
$b = strrpos($str, $end);
if($b === false) return 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===false) return false;
$a = $pos + strlen($start);
$b = strpos($str, $end, $a);
if($b===false) return 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===false) return false;
$a = $pos + strlen($start);
$b = strpos($str, $end, $a);
if($b===false) return 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 === false) return 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 === false) return 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 === false) return 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库进行读取。








