|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
怎么样出来了吧,怎么样自己也可以写出php程序了,虽然离职业和专业的人还有很远,但是好的开始是成功的一半。这个时候改怎么做了呢。现在就是拿1本高手推荐的书,重头到尾读1遍,我说的这个读是自己看。 在网上看到良多复杂的收集教程,特别是针对图书网站的对照多,但附带实例的其实不多,在看了一篇针对八路中文网的抓取剖析后,决意针对这个网站,写一个复杂的抓取教程,并附带实例。因为俺偷懒,文中良多剖析都是来自《使用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一个复杂的实例,收集其实很复杂。。。我先解释一下我的学习思路。 |
|