页面抓取,我只用过两种,一种是file_get_contents,直接从网页上拿数据,但是有些网站会把这个函数禁了,所以还有一种方法,Curl。
我们必须先将该页面的数据获取过来,这时候就要用到file_get_contents这个函数,先获取页面的所有数据:
$url = 'https://blog.csdn.net/zph1234/rss/list';
$file=file_get_contents("compress.zlib://".$url);
页面抓取的时候可能会出现乱码的现象,所以第二行代码中 的 compress.zlib 非常关键,因为获取的头部信息中有Encoding: gzip说明内容是GZIP压缩的
接下来我写了一个规则,用以匹配页面中的元素,从而实现抓取页面的数据:
$preg='#<item>.*</item>#isU';
preg_match_all($preg,$file,$arr);
preg_match_all 这个函数用于执行一个全局正则表达式匹配
,会将我需要的数据筛选出来,我要扒去的数据是我的老师的博客,内容有标题,内容,时间,阅读量等,所以我们要一一循环获取
代码如下
$pat1='#<title>(.*)</title>#isU';
$pat2='#阅读:([1-9]\d*+).*</description>#isU';
$pat3='#<pubDate>(.*)</pubDate>#isU';
$pat4='#<link>(.*)</link>#isU';
foreach ($arr as $key => $v)
{ //二维数组[2]对应id和[1]刚好一样,利用起key
foreach($v as $k => $value)
{
preg_match($pat1, $v[$k], $arr_title);
preg_match($pat2, $v[$k], $arr_con);
preg_match($pat3, $v[$k], $arr_time);
preg_match($pat4, $v[$k], $arr_url);
$arr2['title'][] = addslashes( htmlspecialchars ($arr_title[1]));
$arr2['content'][] = addslashes( htmlspecialchars ($arr_con[1]));
$arr2['ctime'][] = $arr_time[1];
$arr2['url'][] = $arr_url[1];
}
// var_dump($arr2);exit;
}
将这些数据处理成我想要的数组,实现代码如下:
foreach ($arr2 as $key => $val)
{
foreach ($val as $k => $v)
{
$arr_new[$k][$key]=$v;
}
}
将处理后的数组循环添加到数据库中就可以了;