论PHP采集

来源:互联网 发布:手机淘宝安全中心登入 编辑:程序博客网 时间:2024/06/07 17:58

论PHP采集


1. 什么是采集?

网上说,把别人网站的信息搜集和整理放到自己的网站或本地就叫采集。等于没说嘛,我还说把孙子兵法看看记到脑子里就叫采集呢?这种解释无法认识到采集的原貌。所以我们从有血有肉的例子来看什么是采集:这是一个资讯网站,我们的最终目的就是把图片中的标题和内容扒下来,这就是采集。

2. 如何实现采集?

我们想想,我们要采的是什么,这是一个网页,本质是一堆html的源代码,我们需要把网页所有的内容都采集下来(为什么不只挑需要的呢?没那个技术,我们只能做到全扒下来作为字符串,然后处理字符串得到需要的部分),有了这个想法,我们就很自然地想到了两个宝贝:file_get_contents()curl类这两个小家伙,都有自己的优点,先说file_get_contents(),给人的感觉就是简单直接,一个php内置函数,只要在里面填上URL就能把目标网站的东西捕获到字符串了,然后后续处理即可,不过这小子也有无能的地方,对于禁ip的网站,他是捕获不了的,美中不足啊。curl类才是王道啊,也不需要引入任何东西,直接使用curl类中的方法即可。不过这个时候要得到全部内容的字符串时就得多几行代码了,如下:其实解决了禁ip的奥秘就是第四句使用了代理,curl的确技高一筹。
    $url='http://www.koyuncaijing.com/insider/simple.html';//采集地址    $ch=curl_init($url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//1 curl_exec()获取的信息以字符串返回    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0');//http请求中包含User-Agent 火狐//Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 谷歌    $content=curl_exec($ch);//执行抓取任务,获取整个网页内容    curl_close($ch);
故事还没有结束,现在我们拥有了网页全部内容的字符串,接下来要做的就是提取出需要的部分。<1> 考虑到版权,很多时候我们需要替换掉一些固定版权信息
$content=str_replace("云财经讯,"," ",$content);
<2> 开始正则匹配需要的内容(可以把正则理解成简单字符串,去森林里找叫小明的猫是字符串,那正则就是找符合一定条件的那些猫),正则怎么写,这个时候我们就要根据网页源代码的结构来分析;

$pattern1='/nc-con.*?href="(.*?)".*?title="(.*?)"/s' 抓取目标标题规则
正则表达式有了,现在开始用这个式子去找东西,我们使用函数 preg_match_all(),这个函数的作用是找出那些特定的部分并放入到一个二维数组(根据正则的分组来决定二维数组的键数):
preg_match_all($pattern1,$content,$data1);此处我们要的是标题,正好在二维数组的最后一个所以$data1[2]就是我们想要的

这里写图片描述

同理我们抓取内容
$pattern2='/<\/h4>(.*?)(?=<)/s'preg_match_all($pattern1,$content,$data2);$data2[1]就是我们要的(正则断言要加括号,但是不会列入到二维数组)将两个数组合成为二维数组,二维数组的每个下标对应一组标题和内容$arr=array();foreach($data1[2] as $k=>$v){    $arr[]=array('title'=>$v,'content'=>data2[1][$k]);}
终于,我们得到了想要的 $arr
完整代码:(函数封装,写入数据库)<?phpheader("content-type:text/html;charset=utf-8");/*连接数据库*/$host="localhost";$user="root";$pass="";$conn=new mysqli($host,$user,$pass,"zed");if($conn->connect_error){    die("连接失败".$conn->connect_error);}$conn->query("set names utf8");//指定写入数据库时的编码,不然会乱码/*采集函数*/function caiJi(){     /*抓取得到全部字符串*/    $url='http://www.koyuncaijing.com/insider/simple.html';//采集地址    $ch=curl_init($url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//1 curl_exec()获取的信息以字符串返回    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0');//http请求中包含User-Agent 火狐    //Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 谷歌    $content=curl_exec($ch);//执行抓取任务,获取整个网页内容    curl_close($ch);    /*字符替换*/    $content=str_replace("云财经讯","daydaymiddle",$content);    /*正则匹配*/    $pattern1='/nc-con.*?href="(.*?)".*?title="(.*?)"/s';    preg_match_all($pattern1,$content,$data1);    $pattern2='/<\/h4>(.*?)(?=<)/s';    preg_match_all($pattern2,$content,$data2);    /*数组合成*/    $arr=array();    foreach($data1[2] as $k=>$v){        $arr[]=array('title'=>$v,'content'=>$data2[1][$k]);    }    /*返回结果数组*/    return $arr;}$result=caiJi();/*写入数据库*/$j=0;//计数for($k=0;$k<count($result);$k++){    $title=$result[$k]['title'];    $content=trim($result[$k]['content']);    $sql="INSERT INTO `news`(`title`,`content`) VALUES('$title','$content')";    $conn->query($sql);    $j++;}echo '总共插入'.$j.'条数据';?>
0 0
原创粉丝点击