免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6963 | 回复: 10
打印 上一主题 下一主题

[原创]图书网站采集实例教程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-13 18:55 |只看该作者 |倒序浏览
在网上看到很多简单的采集教程,尤其是针对图书网站的比较多,但附带实例的并不多,在看了一篇针对八路中文网的抓取分析后,决定针对这个网站,写一个简单的抓取教程,并附带实例。由于俺偷懒,文中很多分析都是来自《利用PHP制作简单的内容采集器》,俺只是进一步优化了他的流程,并完成了代码实例的编写。
   采集程序其实并不难做,只要分析清楚流程,然后使用合适的正则来取到你想要的内容就可以了。废话不说了,教程开始:
   1.分析入口:
   多打开几本书后,可以发现书名的基本格式是:http://www.86zw.com/Book/书号/Index.aspx。于是得出:


  1. $BookId='1888';
  2. $index="http://www.86zw.com/Book/".$BookId."/Index.aspx";//组合书目首页URL
复制代码

2.打开页面:


  1. $contents=file_get_contents($index);
复制代码

3.抓取图书信息页:


  1. //抓取图书相关信息
  2. preg_match_all("/<div id=\"CrBookTitle\"><span class=\"booktitle\">(.*)<\/span><\/div>/is",$contents,$Arraytitle);
  3. preg_match_all("/【<a href=\"(.*)\"><font color=\"#CC0000\">点击阅读<\/font><\/a>】/is",$contents,$Arraylist);
  4. unset($contents);
  5. $title=$Arraytitle[1][0];//书名
  6. $list="http://www.86zw.com".trim($Arraylist[1][0]);//列表页URL
复制代码

4.创建保存目录及文件:


  1. //生成文本文档名称
  2. $txt_name=$title.".txt";
  3. Creatdir($BookId);//创建图片文件夹
  4. writeStatistic($title."\r\n",$txt_name);//图书标题写入文本文件
复制代码

5.进入列表页:


  1. //进入列表页
  2. $list_contents=file_get_contents($list);
复制代码

6.抓取列表页章节:


  1. //进入列表页
  2. //分章节抓块
  3. preg_match_all("|<div id=\"NclassTitle\">(.*)  【<a href=\"(.*)\">分卷阅读<\/a>】<\/div>(.*)<div id=\"ListEnd\"><\/div>|Uis",$list_contents,$Block);
  4. //计算总章节数
  5. $regcount=count($Block[0]);
复制代码

7.分章节进行抓取:


  1. //进入章节
  2. for($pageBookNum=0;$pageBookNum<$regcount;$pageBookNum++){
  3.     unset($Zhang);
  4.     unset($list_url);
  5.     $Zhang=$Block[1][$pageBookNum];//章节标题
  6.     writeStatistic('章节:'.($pageBookNum+1).' '.$Zhang."\r\n",$txt_name);//章节标题写入文本文件
  7.     preg_match_all("|<li><a href=\"(.*)\" title=\"(.*)\">(.*)<\/a><\/li>|Uis",$Block[3][$pageBookNum],$list_url);
  8.     //进入页面
  9.     for($ListNum=0;$ListNum<count($list_url[1]);$ListNum++){
  10.         unset($Book_url);
  11.         unset($Book);
  12.         unset($Book_contents);
  13.         unset($Book_time);
  14.         unset($Book_title);
  15.         $Book_time=$list_url[2][$ListNum];//小章节更新信息
  16.         $Book_title=$list_url[3][$ListNum];//小章节标题
  17.         $Book_url=preg_replace("'Index.shtm'si",$list_url[1][$ListNum],$list);//小章节链接URL
  18.         writeStatistic(($ListNum+1).'.'.$Book_title.'-'.$Book_time."\r\n",$txt_name);//小章节标题写入文本文件
  19.         $Book=file_get_contents($Book_url);
  20.         //抓取图书内容
  21.         preg_match_all("/<div id=\"BookText\">(.*)<iframe id=hkwxc/is",$Book,$Arraycontents);
  22.         $Book_contents=preg_replace("|<div style='display:none'>.*<\/div>|Uis",'',$Arraycontents[1][0]);
  23.         //$Book_contents=preg_replace("|<br />|Uis",'\n\r',$Book_contents);
  24.         //$Book_contents=preg_replace("|<br>|Uis",'\n\r',$Book_contents);
  25.         $Book_contents=preg_replace("| |Uis",' ',$Book_contents);
  26.         $Book_contents=strip_tags($Book_contents);
  27.         //判断图片页面
  28.         if (preg_match ("/<div align=\"center\"><img src=\".*\" id=\"imgbook\" name=\"imgbook\" border=\"0\" \/><\/div>/i", $Book_contents)) {
  29.             //取图片URL
  30.             preg_match_all("|<div align=\"center\"><img src=\"(.*)\" id=\"imgbook\" name=\"imgbook\" border=\"0\" \/><\/div>|Uis",$Book_contents,$images);
  31.             //取图片
  32.             for($ImageNum=0;$ImageNum<count($images[1]);$ImageNum++){
  33.                 unset($Image_url);
  34.                 $Image_url="http://www.86zw.com".trim($images[1][$ImageNum]);
  35.                 $New_url='image/'.$BookId.'/'.time().'.gif';
  36.                 //复制图片并生成图片连接
  37.                 if (copy($Image_url, $New_url)){
  38.                     $Book_contents.="<img src=$New_url>";
  39.                 }
  40.             }//取图片结束
  41.         }//图片判断结束
  42.         
  43.         writeStatistic($Book_contents,$txt_name);//内容写入文本文件
  44.     }//页面循环结束
  45. }//章节循环结束
复制代码

两个使用的函数:


  1. /**
  2. * 将内如写入指定文件包
  3. *
  4. * 参数: string $sql : 写入的内容
  5.         string $txt_name : 指定文件名
  6. * 返回: void
  7. * 作用域: public
  8. * 日期: 2007-11-29
  9. */
  10. function writeStatistic($sql,$txt_name){
  11.     $filename="txt_packet/".$txt_name;//注意修改文件的路径
  12.     if (file_exists($filename)) {
  13.         $fp=fopen($filename,"a");
  14.     }else{
  15.         $fp=fopen($filename,"w");
  16.     }
  17.    
  18.     $text=$sql;
  19.     fwrite($fp,$text);
  20.     fclose($fp);
  21. }
  22. /**
  23. * 创建文件夹
  24. *
  25. * 参数: string $BookId : 指定文件夹名
  26. * 返回: void
  27. * 作用域: public
  28. * 日期: 2007-11-29
  29. */
  30. function Creatdir($BookId){
  31.    $filename="image/".$BookId;//注意修改文件的路径
  32.     if (!file_exists($filename)) {
  33.         mkdir($filename,0777);
  34.     }
  35. }
复制代码

    自此完成一本书的简单采集。
   写这个就是为了给想了解采集的PHPer一个简单的实例,采集其实很简单。。。

源码下载地址:http://www.wangchong.org/index.php/archives/10

[ 本帖最后由 wangchll 于 2007-12-13 19:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-12-13 23:53 |只看该作者
采集真的很简单吗?
确实,这样子的其实也就是一个file_get_contents和正则匹配
看看163blog或者qzone那些站点,大量的js和ajax调用,那是很让人抓狂的。

论坛徽章:
0
3 [报告]
发表于 2007-12-14 09:46 |只看该作者
当然,做到后来会发现很多棘手的站,比如需要模拟登录的,使用框架的,异步读取的。。。但是人是活的,我们总能想到办法去解决它,写这个只是个入门的东东,用的这个file_get_contents()函数也是常规抓取中根本不会使用的一个函数,但是,这体现了一个简单抓取流程所需要的步骤,各位大侠觉得这个太幼稚,就当是消遣娱乐了。。。谢谢

论坛徽章:
0
4 [报告]
发表于 2007-12-14 10:20 |只看该作者
小偷程序简单实例:

  1. <?php
  2. echo file_get_contents('http://www.w3.org');
复制代码


over, hehe~~

论坛徽章:
0
5 [报告]
发表于 2007-12-15 19:15 |只看该作者
楼上的牛叉

论坛徽章:
0
6 [报告]
发表于 2007-12-16 17:13 |只看该作者
牛X

论坛徽章:
0
7 [报告]
发表于 2007-12-17 07:26 |只看该作者
好~学习~

论坛徽章:
0
8 [报告]
发表于 2007-12-17 12:58 |只看该作者
太受打击了。。。。

论坛徽章:
0
9 [报告]
发表于 2007-12-19 10:21 |只看该作者
采集除了file_get_contents,CURL,还有啥函数可用?

论坛徽章:
0
10 [报告]
发表于 2007-12-20 16:09 |只看该作者
还有fsockopen
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP