<?php
header ( "content-type:text/html;charset=utf-8");
//信息采集,首先确定采集是否需要进行登录?如果不需要登录,就直接进行抓取数据即可
//第一步,确定采集的URL
$url= "http://blog.jobbole.com/category/php-programmer/";
//第二步:选择采集的技术(CURL、file_get_contents、snoopy),我们以CURL为例
//① 初始化CULR
$ch= curl_init ();
//② 模拟浏览器防止网站做了防采集
//请求url地址
$params[ CURLOPT_URL ] = $url;
//是否返回响应头信息
$params[ CURLOPT_HEADER ] = true;
//是否将结果返回
$params[ CURLOPT_RETURNTRANSFER ] = true;
//是否重定向
$params[ CURLOPT_FOLLOWLOCATION ] = true;
//伪造浏览器
$params[ CURLOPT_USERAGENT ] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 F
irefox/9.0.1';
//③ 开始发送请求,传入curl参数
curl_setopt_array($ch, $params);
//④ 执行抓取
$content= curl_exec ($ch);
/*$preg="#<div class=\"navigation margin-20\">(.*)<a class='page-numbers' href='(.*)'>(.*)</a
>(.*)</div>#isU";
preg_match_all($preg,$content,$page);
print_r($page);
die;
*/
//第三步:信息采集到手后记录在content的变量中,简而言之,这个变量是一个字符串(html),加下来
就是写正则来匹配这个字符串里我们想要的内容
//正则从哪开始匹配呢?从你想要的地方开始,右键查看源代码,找到html的节点
//现在只匹配img的地址
$preg= '#<div class="post-thumb">(.*)<a target="_blank" (.*)><img src="(.*)" alt="" wi
dth="120" height="120" /></a>(.*)</div>#isU';
preg_match_all ($preg,$content,$img);
$info[ 'img']=$img[3];
//匹配标题、内容、时间
$preg= '#<div class="post-meta">(.*)<p>(.*)<a (.*)>(.*)</a><br />(.*)· <a href=
"(.*)" title="(.*)" (.*)>(.*)</a>(.*)</p>(.*)<span class="excerpt"><p>(.*)</p>(.*)</
span>(.*)</div>#isU';
preg_match_all ($preg,$content,$arr);
注:到此已经采集完毕以下就是把已经采集出来的数据赋值给新的数组并用PDO入库
//标题赋值给新数组
$info[ 'title']=$arr[4];
//发布时间赋值给新数组
$info[ 'add_time']=$arr[5];
//文章内容简介赋值给新数组
$info[ 'content']=$arr[12];
//第四步:数据匹配完成,其实抓取就完成了,但是根据你的需求,如果需要由业务处理及数据库操作,
那么你就写你的吧,以下的代码与采集无关
//业务1:需要将图片缓存到本地
//由于图片是跟多个的,一个一个访问保存是不行的,所以要循环
r for($i=0;$i< count ($info[ 'img']);$i++){
//使用file_get_contents()来抓取图片 $res是一个资源 你要是直接输出看 就是一堆乱码
$res=@ file_get_contents ($info[ 'img'][$i]);
//看看吧//var_dump($res);//die;
//把这个资源再通过一定的函数处理放入到我们本机的指定位置里来存储这些图片,存储就相当于是
吧文件内容写入到某个地方去,那么就用到了存储的函数叫做file_put_contents()
//为了防止图片格式在保存的时候不统一,我们就获取源URL中的图片后缀名,作为我保留在本地图片
的后缀名
//htttp://e2131231/3123/123/123/123/a.jpg
$img_type= substr ($info[ 'img'][$i], strrpos ($info[ 'img'][$i], "."));
$path= "./img/". time (). rand (1,9999999). mt_rand ().$img_type;
//$path代表的是我本地存储的新图片的路径,覆盖掉原本网路路径,入库的时候入这个路径即可
$info[ 'img'][$i]=$path;
file_put_contents ($path,$res);
}
//业务2:需要将信息插入数据库中
//首先先将数组进行一个处理,编程一条信息占一个小数组
foreach($info as $key=>$val){
r for($i=0;$i< count ($val);$i++){
$new_info[$i][]=$info[$key][$i];
}
}
//业务3:调用数据库抽象逻辑层PDO形式入库
//实例化PDO
$dsn= "mysql:host=127.0.0.1;dbname=test";
$db= new PDO($dsn, 'root', 'root');
$sql= "insert into blog (b_img,b_title,b_date,b_content) values ";
r for($i=0;$i< count ($new_info);$i++){
$sql.= "(";
r for($j=0;$j< count ($new_info[$i]);$j++){
$sql.= "'". trim ($new_info[$i][$j]). "',";
}
$sql= substr ($sql,0,-1);
$sql.= "),";
}
$sql= substr ($sql,0,-1);
//执行sql语句
//为了防止中文插入数据库的时候有乱码产生,那么在插入志气啊先告诉数据库我给你的数据格式是UTF8
$db->exec( "set names utf8");
$count=$db->exec($sql);
f if($count){
echo "恭喜你,顺利采集出".$url. "网站的".$count. "条数据";
} else{
echo "采集失败,请刷新重试!";
}
//关闭数据库连接,目的是释放资源,减少占用内存
$db = null;
//如果页面上有分页的话,那么就需要继续抓群不能只抓取第一页了
$preg= "#<span class='page-numbers current'>(.*)</span>#isU";
preg_match_all ($preg,$content,$page);
print_r ($pag);
//关闭CURL连接,目的是释放资源,减少占用内存
curl_close ($ch);