首页编程PHP典型模块内容自动采集器模块文章详细

内容自动采集器功能及采集原理

原创 2023-09-25 21:23:16 222

网站内容的组成除了编辑录入原创内容外,还可以通过后台的内容采集功能获取指定内容源信息。使用内容自动采集器可以使得网站的内容多样化,同时减少网站编辑人员的工作量。因此,内容自动采集器功能是网站后台的必要功能之一。读者通过本章的学习,可以了解内容采集的基本原理和实现方法,直观地了解正则表达式在内容采集过程中的核心作用,其中涉及的技术细节和知识点也将在讲解例子的时候逐一阐述。

本章主要涉及的知识点如下。

file_get_contents()函数:函数把整个文件读入一个字符串中。

preg_match_all()函数:进行全局正则表达式匹配。

FCKeditor编辑器:被广泛使用的、开放源代码的“所见即所得”文字编辑器。任务接力模式:

任务接力模式的本质是对一个任务做拆分,将一个任务拆分成多个子任务来实现。

1. 内容自动采集器功能及采集原理

内容采集,顾名思义就是对互联网的公共信息资源按照一定的要求进行自动的采集、过滤、整理,再按照一定的规则存入数据库中。根据这个目标可以看到,内容自动采集器的功能由3部分组成,即数据规则模型管理、采集节点管理、已下载内容管理。

在实际的应用中,根据不同的业务应用领域会对应强化某部分的功能。如果要采集的目标网站内容格式十分复杂,就要强化“数据规则模型管理”定制适用于不同类型站点的采集规则;如果需要经常更换采集的信息源,则需要强化“采集节点管理”和“重复内容过滤”功能。常见的典型应用则是将上述的功能整合到一起,在一个界面上操作会更高效、快捷。总之,需要根据实际业务将上述的功能结合使用。

内容自动采集器采集数据的一般流程如下:

(1)根据预先定义的抓取规则,获取一个栏目的网页中的所有内容,需要先将这个网页的网址列表记录下来制作成采集列表。

(2)程序根据定义的规则抓取列表页面,从中分析整理出网址列表,然后再去抓取获得网址的网页中的内容。

(3)程序根据具体页面的采集规则,对下载到的网页分析,将标题内容等信息分离开,核对无误后存入数据库。

本节具体介绍内容采集技术实现的原理和流程。

1.1 URL地址列表分析

待采集列表页面形式可以分为单页网址、多页网站、复合页网址3种。根据页面的不同类型采用不同的流程控制,具体的流程控制代码如下:

<?php
switch(URL){
    case 1:
        //单页的设置
        $url [0]= URL;
        break;
    case 2:
        //多页的设置
        $list_content = file get contents ($row->url);
        //观察链接特征:<1i> <a href=" "自主的胜利?"target="_blank"class="f1”>自主的胜利?</a ><i>//获取列表正则规则
        $list_match = Srow[2];
        preg_match_all($list_match,$list_content,Slist_data);
        break;
    case 3:
    //其他类型的网址观察具体的链接特征应用不同的正则规则
    break;
}
?>

【代码解读】

上述代码通过switch()函数判断链接的类型,然后根据链接“特征”匹配正则表达式的规则获取指定的内容,这里可以将switch()函数看作程序的流程控制器。

1.2 获得内容页面信息

当获得待下载的列表页面后,就可以提取需要的信息了。该程序功能最重要的就是提取正则表达式的部分,因为只要获得部分采集者认为有意义的信息即可。内容获取部分的流程代码如下:

<?php
//功能:获得内容页面信息
foreach ( $list_data [1] as $detail_url){
    $handles = @file_get_contents ($detail_url);//载入URL地址页
    preg_match_all("/".链接规则."/isU",$handles,$content_match);
    //正则表达式匹配链接规则
    INSERT INTO 'links'('title','url','rules','date');
    //所得内容页面链接地址写入数据库Link表
}
?>

【代码解读】

其中,变量$list_data[1]代表已获得的列表数组,$content_match代表正则表达式匹配链接内容的规则。其中核心的部分是两个函数,即file_get_contents()preg_match_all()preg_match_all()是正则函数,用来安装正则表达式定制的规则并提取相应的内容。

注意:file_get_contents()函数是远程读取网页内容的,需要在PHP5以上的版本才能使用。

1.3 延时函数

由于PHP脚本有30秒的执行限制,当执行时间大于30秒时,系统会报一个超时的“致命级”错误终止程序运行,所以在抓取大量内容时需要应用下面的延时函数。

<?php
//功能:延时函数
$ch= curl_init();
//设置超时时间
$timeout=100;
curlsetopt $ch,CURLOPT_URL, $url);
curlsetopt ($ch,CURLOPT_RETURNTRANSFER, 1);
curl setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$handles=curl exec($ch); //执行句柄
curl_close($ch); //关闭连接
?>

【代码解读】

上述函数的核心是curl_setopt()函数,它将为一个CURL 会话设置选项。该函数的描述如下:

bool curl_setopt(int ch, string option, mixed value)

其中,option参数是具体的操作设置,value是这个选项给定的数值。

1.4 获取全部列出形式

在执行以上的步骤后,程序已经获得了所需的内容信息。在对页面进行分页分析整理后全部列出形式,核心流程代码如下:

<?php
//正则匹配分页区域
preg_match("/".分页规则."/isU",$buffer,$regs2);
//查找每个分割里面的网址 for保证网址不重复
preg_match_all("/".'<[^<>]*(href|value)=(\"|\)?([^\'\"<>]*)(\"\')?[^<>]*>'."/isU",$regs2[1], $regs3);
for($i = 0; $i <= count($regs3[3]);$i++){
    $qethttp=$string->gethttp($regs3[3][$i]);
    $buffer2=@file_get_contents($gethttp);
    //延时
    if (empty($buffer2)){
        if($phpcurl_init == yes){
            $ch = curl_init();
            $timeout= 10; //设置延时时间
            curl_setopt($ch, CURLOPT_URL,$regsar[]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,$timeout);
            $buffer2 = curl_exec($ch); //执行句柄
            curl_close ($ch); //关闭连接
        }
        preg_match("/".内容规则."/isU",$buffer2, $regss);
        $cont.=$regss[1];

    }

}
?>

【代码解读】

上述代码通过分页的规则匹配出分页列表,然后通过查找每个分割单元里的网址(for函数排除重复网址),从而获得全部列出形式的列表数组。

1.5分页分析

当文章内容过多时通常都会采用分页的形式,这样保证了页面的整体美观。但是对于采集程序而言就需要多做一步分页的分析工作,程序根据不同的分页样式分析出上下页形式。分页分析的流程代码如下:

<?php
if(preg_match("/".分页规则."/isU",$buffer,$ljregs))
{
    while ($ljregs[1] != ""){
        $ljreqs[1] = $string->gethttp ($ljregs[1]);
        $buffer= @file_get_contents($ljregs[1]);
        //延时
        if (empty($buffer)){
            if($phpcurl_init == yes){
                $ch = curl_init();
                $timeout= 10; //设置延时时间
                curl_setopt($ch, CURLOPT_URL,$ljregs[1]);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,$timeout);
                $buffer2 = curl_exec($ch); //执行句柄
                curl_close ($ch); //关闭连接
            }
        }
        preg_match("/".$body_rule."/isU", $buffer, $regs);//匹配规则
        $cont .=$regs[1];
    }
}
?>

【代码解读】

上述代码根据获得分页规则的不同,匹配不同的上下页形式,通过while()函数嵌套if()函数,对获得内容过程中的异常状态进行排除处理。

注意:在file_get_contents()函数前使用@符号,可以抑制程序报错时的输出。

推荐