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

本文发布于:2012-09-12,最后更新于:2021-02-09,如果内容失效请留言告知。

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

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

code: ' + ddLang + advanced + '
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
匹配给定页面链接
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