php正则匹配获取指定url网页页面超级链接地址与抓取指定页面内容方法

在数据采集与页面分析中,常需要抓取给定url页面的内容,或者第二、第三层次深度页面内容。

这里是一个测试例子的实现,仅供参考。

/*
匹配给定页面链接 
return:array match[link,content,all]
*/
function match_links($host, $document) {
    $pattern = '/<a(.*?)href="(.*?)"(.*?)>(.*?)</a>/i';  
    preg_match_all($pattern, $document, $m);  
    return $m;

    preg_match_all("'<s*as.*?hrefs*=s*(["'])?(?(1)(.*?)\1|([^s>]+))[^>]*>?(.*?)</a>'isx",$document,$links);
    while(list($key,$val) = each($links[2])) {
        if(!empty($val))
            if(preg_match("/http/",$val)){
                $match['link'][] = $val;
            }
            else {
                $match['link'][] = $host . $val;
            }
    }
    while(list($key,$val) = each($links[3])) {
        if(!empty($val))
            if(preg_match("/http/",$val)){
                $match['link'][] = $val;
            }
            else {
                $match['link'][] = $host . $val;
            }
    }
    while(list($key,$val) = each($links[4])) {
        if(!empty($val))
            $match['content'][] = $val;
    }
    while(list($key,$val) = each($links[0])) {
        if(!empty($val))
            $match['all'][] = $val;
    }
    return $match['link'];
}

/*
从给定url中获取页面文本内容
*/
function get_content_from_url($url) {
    $str = @file_get_contents($url);
    if(mb_check_encoding($str, "GBK"))
        $str = iconv("GBK","UTF-8", $str);
    $str = strip_tags($str);    //  过滤html标签
/*  
    $str = preg_replace( "@<script(.*?)</script>@is", "", $str );
    $str = preg_replace( "@<iframe(.*?)</iframe>@is", "", $str );
    $str = preg_replace( "@<style(.*?)</style>@is", "", $str );
    $str = preg_replace( "@<(.*?)>@is", "", $str ); 
*/
    //过滤非汉字字符
    preg_match_all('/[x{4e00}-x{9fff}]+/u', $str, $matches);
    $str = join(',', $matches[0]);
    if(!$str)
        return NULL;
    
    return $str;
}

function get_content($url,$depth) {
    if(!$url || $depth < 1)
        return false;

    while($depth > 1){
        $str = @file_get_contents($url);
        if(!$str)
            return false;

        $parseurl = parse_url($url);    
        if($parseurl['host'])
            $host = $parseurl[scheme] . "://" . $parseurl['host'];
        
        $arrlink = match_links($host,$str);
        $arr_url = array_unique($arrlink);

        $depth--;
        foreach($arr_url as $url){
            $content .= get_content($url, $depth);  //递归调用
        }
    }

    $content .= get_content_from_url($url);
        
    return $content;
}

 

点赞 (0)
  1. 圆刀片说道:

    都是很专业的东西,我看的不是太懂。望指教

  2. 任侠说道:

    testadb,yes

  3. Ludou说道:

    友情提醒一下,Adsense广告被遮蔽是违反合作规范的,小心。。。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code