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

2. 如何实现采集?
$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> 开始正则匹配需要的内容(可以把正则理解成简单字符串,去森林里找叫小明的猫是字符串,那正则就是找符合一定条件的那些猫),正则怎么写,这个时候我们就要根据网页源代码的结构来分析;

正则表达式有了,现在开始用这个式子去找东西,我们使用函数 preg_match_all(),这个函数的作用是找出那些特定的部分并放入到一个二维数组(根据正则的分组来决定二维数组的键数):
此处我们要的是标题,正好在二维数组的最后一个
所以$data1[2]就是我们想要的

同理我们抓取内容
$data2[1]就是我们要的(正则断言要加括号,但是不会列入到二维数组)
将两个数组合成为二维数组,二维数组的每个下标对应一组标题和内容
$arr=array();
foreach($data1[2] as $k=>$v){
$arr[]=array('title'=>$v,'content'=>data2[1][$k]);
}
终于,我们得到了想要的 $arr
完整代码:(函数封装,写入数据库)
<?php
header("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);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0');
$content=curl_exec($ch);
curl_close($ch);
$content=str_replace("云财经讯","daydaymiddle",$content);
$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.'条数据';
?>