记得刚学php时,php100的张恩民老师就讲了一个“小偷程序”,那时我还不知道原来这就是采集啊,之后很长一段时间都没碰过“采集”,偶尔逛论坛的时候也会听到有人在讲采集,总感觉采集怎么那么像以前的那个“小偷程序”,后来才知道原来“小偷程序”就是采集。
最近在迷上一本仙侠“九阳绝脉”,觉得很好看,就问了作者可不可以在我的网站上连载,作者说可以,可麻烦的是他的小说有那么多章,如果我一章一章插入到数据库,这个工作量得多大,我突然想可不可以用采集来完成这个工作呢,马上测试了一下,果然行,不用几分钟就把它小说的内容采集到我的网站来了,下面我会讲一下我是怎么使用采集来完成这个工作的。(对于采集,我也还只是新手,有什么错误之处欢迎提出)
看了上面那么多,大家都应该大致对采集有一个了解了吧,简单来说,采集就是从别人的网站上获取我们要想要的内容,这感觉有点像“偷取”,所以也俗称“小偷程序”。采集大概一个工作流程如下:
1、寻找目标网站sUrl。(用file_get_contents(sUrl)获得目标网站的全部内容)
2、获得自己想要的内容(查看源文件,分析我们想要内容在什么标记之间,然后用正则表达式来匹配得到我们想要的内容)
3、将所得到的内容插入到我们的数据库(当然这里还要先对获得的内容进行过滤)
先举一个最简单的例子,采集百度的标题
<?php
//目标网站sUrl="http://www.baidu.com";
sUrl="http://www.baidu.com";
$con=file_get_contents(sUrl);用file_get_contents()来获取网站的全部内容;
//我们要采集的是百度的标题,先查看源文件,百度的标题在<title></title>标记之间,然后用正则表达式来匹配<title></title>标记之间的内容。
eregi("<title>(.*)</title>",$con,$title_arr); //这里不对函数作解释了,这句的意思就是把<title></title>标记之间的内容匹配出来,然后保存到$title_arr数组上。
print_r($title_arr);//输出数组信息,我们会看到array(0=>"<title>百度一下,你就知道</title>",1=>"百度一下,你就知道");
//从上面的输出我可以看到,$title_arr[1]才是我们真正要匹配的内容。
?>下面我讲一下怎么批量采集,不过这个批量采集有一定的条件,1、目标网址成一定规律递增,比如说网址1:http://googlephp.cn/1.html;网址2:http://googlephp.cn/2.html,依次类推。。。 2、批量采集的内容都在相同的标记之间。
我也就是通过批量采集来获得小说的内容,然后插入到我的数据库,下面实例看一下怎么完成这个工作的。
<?php
//我要采集的是小说阅读网---九阳绝脉1-163章的内容,而这1-163章的网址都是依次递增的。
//目标网址从http://www.readnovel.com/novel/69764/1.html到http://www.readnovel.com/novel/69764/163.html
//所以我这里可以用一个循环,依次读取每一章的内容;
for($i=1;$i<=163;$i++){
$sUrl="http://www.readnovel.com/novel/69764/".$i.".html";
$con=file_get_contents($sUrl);//读取网站的全部内容;
//查看源文件,分析我们想得到的内容在什么标记之间。我这里要得到是每一章的标题跟内容,它们在<div id="article"></div>标记之间。
//但是却不能直接匹配<div id="article"></div>之间的内容,因为后面还有</div>这个标记,它会把后面的内容也匹配进来,所以采集的时候要注意我们
//要匹配的内容是不是在惟一的标记之间。所以我又在<div id="article"></div>标记下找了一个<p class="shop">标记。
eregi("<div id=\"article\">(.*)<p class=\"shop\">",$con,$con_arr)//把<div id="article"><p class="shop">标记之间的内容匹配出来。
//我们已经获得了我们想要的内容,接下来还要把文章的标题跟文章的内容分离出来
eregi("<h2>(.*)</h2>",$con_arr[1],$title_arr) //从我们获得的内容再把<h2></h2>标记之间的内容匹配出来,也就是文章的标题。
$title=addslashes($title_arr[1]); //前面已经说了$title_arr[1]才是我们真正要的内容,另外还要进行转义,因为还要插入到数据库。
eregi("</h2>(.*)</div>",$con_arr[1],$content_arr);//把</h2></div>标记之间的内容匹配出来,也就是文章的内容。
$content=addslashes($content_arr[1]);
$sql="insert into novel(id,title,content) values('','$title','$content');
mysql_query($sql);//插入到数据库,前面还要对数据库连接,这里没写了。
}
//搞定,收工。
?>第一次使用采集,可能理解还不是很深,欢迎一起讨论。另喜欢武侠仙侠的朋友可以看一下我采集的小说“九阳绝脉”。
PS:对于采集别人网站的内容可能会涉及到版权问题,所以最好跟原作者联系好。
