论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
- 论PHP采集
- PHP采集
- php采集
- php采集
- PHP采集
- php信息采集程序
- PHP采集利器:Snoopy
- php采集论坛
- php 采集入库
- PHP采集代码实例
- php数据采集
- PHP采集 抓取
- PHP采集利器:Snoopy
- PHP采集防IP
- PHP采集 抓取
- PHP采集程序(爬虫)
- php socket采集实例
- PHP数据采集
- linux send与recv函数详解
- 如何加快建 index 索引 的时间
- 克隆(深度,浅度)
- C# DevExpress GridControl导出表格
- 一款实用的RecyclerView的线性布局分割线
- 论PHP采集
- cas login界面增加标记作用的属性(定义异常提示二)
- Spring MVC ModelAndView详解
- php 环境搭建
- 2017-03-15-react-css3-transition
- cas登陆页定义异常提示(中英文等
- Java数据结构(一)——StringBuffer,StringBuilder,Collection,Iterator,List
- android ble开发整理
- Android的Usb设备的监听(Dev)外设端口的判定以及耳机的插拔