在网上看到很多简单的采集教程,尤其是针对图书网站的比较多,但附带实例的并不多,在看了一篇针对八路中文网的抓取分析后,决定针对这个网站,写一个简单的抓取教程,并附带实例。由于俺偷懒,文中很多分析都是来自《利用php制作简单的内容采集器》,俺只是进一步优化了他的流程,并完成了代码实例的编写。
采集程序其实并不难做,只要分析清楚流程,然后使用合适的正则来取到你想要的内容就可以了。废话不说了,教程开始:
1.分析入口:
多打开几本书后,可以发现书名的基本格式是:http://www.86zw.com/book/书号/index.aspx。于是得出:
代码:
$bookid='1888';
$index="http://www.86zw.com/book/".$bookid."/index.aspx";//组合书目首页url
2.打开页面:
代码:
$contents=file_get_contents($index);
3.抓取图书信息页:
代码:
//抓取图书相关信息
preg_match_all("/<div id=/"crbooktitle/"><span class=/"booktitle/">(.*)<//span><//div>/is",$contents,$arraytitle);
preg_match_all("/【<a href=/"(.*)/"><font color=/"#cc0000/">点击阅读<//font><//a>】/is",$contents,$arraylist);
unset($contents);
$title=$arraytitle[1][0];//书名
$list="http://www.86zw.com".trim($arraylist[1][0]);//列表页url
4.创建保存目录及文件:
代码:
//生成文本文档名称
$txt_name=$title.".txt";
creatdir($bookid);//创建图片文件夹
writestatistic($title."/r/n",$txt_name);//图书标题写入文本文件
5.进入列表页:
代码:
//进入列表页
$list_contents=file_get_contents($list);
6.抓取列表页章节:
代码:
//进入列表页
//分章节抓块
preg_match_all("|<div id=/"nclasstitle/">(.*) 【<a href=/"(.*)/">分卷阅读<//a>】<//div>(.*)<div id=/"listend/"><//div>|uis",$list_contents,$block);
//计算总章节数
$regcount=count($block[0]);
7.分章节进行抓取:
代码:
//进入章节
for($pagebooknum=0;$pagebooknum<$regcount;$pagebooknum++){
unset($zhang);
unset($list_url);
$zhang=$block[1][$pagebooknum];//章节标题
writestatistic('章节:'.($pagebooknum+1).' '.$zhang."/r/n",$txt_name);//章节标题写入文本文件
preg_match_all("|<li><a href=/"(.*)/" title=/"(.*)/">(.*)<//a><//li>|uis",$block[3][$pagebooknum],$list_url);
//进入页面
for($listnum=0;$listnum<count($list_url[1]);$listnum++){
unset($book_url);
unset($book);
unset($book_contents);
unset($book_time);
unset($book_title);
$book_time=$list_url[2][$listnum];//小章节更新信息
$book_title=$list_url[3][$listnum];//小章节标题
$book_url=preg_replace("'index.shtm'si",$list_url[1][$listnum],$list);//小章节链接url
writestatistic(($listnum+1).'.'.$book_title.'-'.$book_time."/r/n",$txt_name);//小章节标题写入文本文件
$book=file_get_contents($book_url);
//抓取图书内容
preg_match_all("/<div id=/"booktext/">(.*)<iframe id=hkwxc/is",$book,$arraycontents);
$book_contents=preg_replace("|<div style='display:none'>.*<//div>|uis",'',$arraycontents[1][0]);
//$book_contents=preg_replace("|<br />|uis",'/n/r',$book_contents);
//$book_contents=preg_replace("|<br>|uis",'/n/r',$book_contents);
$book_contents=preg_replace("| |uis",' ',$book_contents);
$book_contents=strip_tags($book_contents);
//判断图片页面
if (preg_match ("/<div align=/"center/"><img src=/".*/" id=/"imgbook/" name=/"imgbook/" border=/"0/" //><//div>/i", $book_contents)) {
//取图片url
preg_match_all("|<div align=/"center/"><img src=/"(.*)/" id=/"imgbook/" name=/"imgbook/" border=/"0/" //><//div>|uis",$book_contents,$images);
//取图片
for($imagenum=0;$imagenum<count($images[1]);$imagenum++){
unset($image_url);
$image_url="http://www.86zw.com".trim($images[1][$imagenum]);
$new_url='image/'.$bookid.'/'.time().'.gif';
//复制图片并生成图片连接
if (copy($image_url, $new_url)){
$book_contents.="<img src=$new_url>";
}
}//取图片结束
}//图片判断结束
writestatistic($book_contents,$txt_name);//内容写入文本文件
}//页面循环结束
}//章节循环结束
两个使用的函数:
代码:
/**
* 将内如写入指定文件包
*
* 参数: string $sql : 写入的内容
string $txt_name : 指定文件名
* 返回: void
* 作用域: public
* 日期: 2007-11-29
*/
function writestatistic($sql,$txt_name){
$filename="txt_packet/".$txt_name;//注意修改文件的路径
if (file_exists($filename)) {
$fp=fopen($filename,"a");
}else{
$fp=fopen($filename,"w");
}
$text=$sql;
fwrite($fp,$text);
fclose($fp);
}
/**
* 创建文件夹
*
* 参数: string $bookid : 指定文件夹名
* 返回: void
* 作用域: public
* 日期: 2007-11-29
*/
function creatdir($bookid){
$filename="image/".$bookid;//注意修改文件的路径
if (!file_exists($filename)) {
mkdir($filename,0777);
}
}
自此完成一本书的简单采集。
写这个就是为了给想了解采集的phper一个简单的实例,采集其实很简单。。。