仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2517|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP图书网站收集实例教程

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:53:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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",&#36;contents,&#36;Arraytitle);
preg_match_all("/【<a href=\"(.*)\"><font color=\"#CC0000\">点击浏览<\/font><\/a>】/is",&#36;contents,&#36;Arraylist);
unset(&#36;contents);
&#36;title=&#36;Arraytitle[1][0];//书名
&#36;list="http://www.86zw.com".trim(&#36;Arraylist[1][0]);//列表页URL
4.创立保留目次及文件:

代码:
//生成文本文档称号
&#36;txt_name=&#36;title.".txt";
Creatdir(&#36;BookId);//创立图片文件夹
writeStatistic(&#36;title."\r\n",&#36;txt_name);//图书题目写入文本文件
5.进出列表页:

代码:
//进出列表页
&#36;list_contents=file_get_contents(&#36;list);
6.抓取列表页章节:

代码:
//进出列表页
//分章节抓块
preg_match_all("|<div id=\"NclassTitle\">(.*)  【<a href=\"(.*)\">分卷浏览<\/a>】<\/div>(.*)<div id=\"ListEnd\"><\/div>|Uis",&#36;list_contents,&#36;Block);
//盘算总章节数
&#36;regcount=count(&#36;Block[0]);
7.分章节停止抓取:

代码:
//进入章节
for(&#36;pageBookNum=0;&#36;pageBookNum<&#36;regcount;&#36;pageBookNum++){
    unset(&#36;Zhang);
    unset(&#36;list_url);
    &#36;Zhang=&#36;Block[1][&#36;pageBookNum];//章节题目
    writeStatistic('章节:'.(&#36;pageBookNum+1).' '.&#36;Zhang."\r\n",&#36;txt_name);//章节题目写入文本文件
    preg_match_all("|<li><a href=\"(.*)\" title=\"(.*)\">(.*)<\/a><\/li>|Uis",&#36;Block[3][&#36;pageBookNum],&#36;list_url);
    //进入页面
    for(&#36;ListNum=0;&#36;ListNum<count(&#36;list_url[1]);&#36;ListNum++){
        unset(&#36;Book_url);
        unset(&#36;Book);
        unset(&#36;Book_contents);
        unset(&#36;Book_time);
        unset(&#36;Book_title);
        &#36;Book_time=&#36;list_url[2][&#36;ListNum];//小章节更新信息
        &#36;Book_title=&#36;list_url[3][&#36;ListNum];//小章节题目
        &#36;Book_url=preg_replace("'Index.shtm'si",&#36;list_url[1][&#36;ListNum],&#36;list);//小章节链接URL
        writeStatistic((&#36;ListNum+1).'.'.&#36;Book_title.'-'.&#36;Book_time."\r\n",&#36;txt_name);//小章节题目写入文本文件
        &#36;Book=file_get_contents(&#36;Book_url);
        //抓取图书内容
        preg_match_all("/<div id=\"BookText\">(.*)<iframe id=hkwxc/is",&#36;Book,&#36;Arraycontents);
        &#36;Book_contents=preg_replace("|<div style='display:none'>.*<\/div>|Uis",'',&#36;Arraycontents[1][0]);
        //&#36;Book_contents=preg_replace("|<br />|Uis",'\n\r',&#36;Book_contents);
        //&#36;Book_contents=preg_replace("|<br>|Uis",'\n\r',&#36;Book_contents);
        &#36;Book_contents=preg_replace("| |Uis",' ',&#36;Book_contents);
        &#36;Book_contents=strip_tags(&#36;Book_contents);
        //判别图片页面
        if (preg_match ("/<div align=\"center\"><img src=\".*\" id=\"imgbook\" name=\"imgbook\" border=\"0\" \/><\/div>/i", &#36;Book_contents)) {
            //取图片URL
            preg_match_all("|<div align=\"center\"><img src=\"(.*)\" id=\"imgbook\" name=\"imgbook\" border=\"0\" \/><\/div>|Uis",&#36;Book_contents,&#36;images);
            //取图片
            for(&#36;ImageNum=0;&#36;ImageNum<count(&#36;images[1]);&#36;ImageNum++){
                unset(&#36;Image_url);
                &#36;Image_url="http://www.86zw.com".trim(&#36;images[1][&#36;ImageNum]);
                &#36;New_url='image/'.&#36;BookId.'/'.time().'.gif';
                //复制图片并生成图片毗连
                if (copy(&#36;Image_url, &#36;New_url)){
                    &#36;Book_contents.="<img src=&#36;New_url>";
                }
            }//取图片停止
        }//图片判别停止
        
        writeStatistic(&#36;Book_contents,&#36;txt_name);//内容写入文本文件
    }//页面轮回停止
}//章节轮回停止
两个利用的函数:

代码:
/**
* 将内如写入指定文件包
*
* 参数: string &#36;sql : 写入的内容
        string &#36;txt_name : 指定文件名
* 前往: void
* 感化域: public
* 日期: 2007-11-29
*/
function writeStatistic(&#36;sql,&#36;txt_name){
    &#36;filename="txt_packet/".&#36;txt_name;//注重修正文件的途径
    if (file_exists(&#36;filename)) {
        &#36;fp=fopen(&#36;filename,"a");
    }else{
        &#36;fp=fopen(&#36;filename,"w");
    }
   
    &#36;text=&#36;sql;
    fwrite(&#36;fp,&#36;text);
    fclose(&#36;fp);
}
/**
* 创立文件夹
*
* 参数: string &#36;BookId : 指定文件夹名
* 前往: void
* 感化域: public
* 日期: 2007-11-29
*/
function Creatdir(&#36;BookId){
   &#36;filename="image/".&#36;BookId;//注重修正文件的途径
    if (!file_exists(&#36;filename)) {
        mkdir(&#36;filename,0777);
    }
}
自此完成一本书的复杂收集。
   写这个就是为了给想懂得收集的PHPer一个复杂的实例,收集其实很复杂。。。
我先解释一下我的学习思路。
柔情似水 该用户已被删除
沙发
发表于 2015-2-4 06:49:30 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
分手快乐 该用户已被删除
板凳
发表于 2015-2-5 14:43:07 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
地板
发表于 2015-2-12 06:54:12 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
小妖女 该用户已被删除
5#
发表于 2015-2-15 20:30:45 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
莫相离 该用户已被删除
6#
发表于 2015-3-6 10:58:49 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-13 00:07:29 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
admin 该用户已被删除
8#
发表于 2015-3-20 06:23:37 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
精灵巫婆 该用户已被删除
9#
发表于 2015-3-22 04:07:51 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
深爱那片海 该用户已被删除
10#
发表于 2015-4-9 19:06:41 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
爱飞 该用户已被删除
11#
发表于 2015-4-16 03:10:08 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
若相依 该用户已被删除
12#
发表于 2015-5-4 14:46:16 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
乐观 该用户已被删除
13#
发表于 2015-5-6 08:12:01 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
再见西城 该用户已被删除
14#
发表于 2015-6-29 05:25:04 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
冷月葬花魂 该用户已被删除
15#
发表于 2015-7-20 00:41:48 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
第二个灵魂 该用户已被删除
16#
发表于 2015-7-21 13:46:16 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
简单生活 该用户已被删除
17#
发表于 2015-7-24 09:57:29 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
因胸联盟 该用户已被删除
18#
发表于 2015-9-22 20:20:32 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
愤怒的大鸟 该用户已被删除
19#
发表于 2015-10-5 21:55:36 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-29 07:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表