共计 1850 个字符,预计需要花费 5 分钟才能阅读完成。
提醒:本文最后更新于2021-02-09 09:00,文中所关联的信息可能已发生改变,请知悉!
在数据采集与页面分析中,常需要抓取给定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; | |
} |
正文完