在网上看到很多简单的采集教程,尤其是针对图书网站的比较多,但附带实例的并不多,在看了一篇针对八路中文网的抓取分析后,决定针对这个网站,写一个简单的抓取教程,并附带实例。由于俺偷懒,文中很多分析都是来自《利用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
1、大家来说说URL映射吧
一般url映射有两种方式,一种是通过mod_rewrite实现,这种网上教材很多我也不多说了。另外一种是在程序中模拟,比如类似zend Framework中的那种方式/index.php/controller/action/var1/value1/var2/value2/。这里方式其实最主要是通过一个统一的输入接口,然后对url进行解析,最后转发到相应的controller中的module。
Read the rest of this entry »
模拟登陆可以用curl或者socket来实现,当curl需要服务器相应的启用curl module,自己socket实现相对比较麻烦,使用snoopy就简单了很多啦。
在这里,我们使用喜悦国际村做为例子。(^_^,纯属研究)
首先,我们要获取到登陆需要发送什么字段,目标地址是什么。这里我们使用snoopy的fetchform来实现。
- <?php
- include "Snoopy.class.php";
- $snoopy = new Snoopy;
- $snoopy->fetchform("http://www.phpx.com/happy/logging.php?action=login");
- print $snoopy->results;
- ?>
当然你也可以直接查看http://www.phpx.com/happy/logging.php?action=login的源代码来实现,不过这样更加方便把。这里,我们获取到目标和提交的数据,下一步就可以实现模拟登陆了。代码如下:
- <?php
- include "Snoopy.class.php";
- $snoopy = new Snoopy;
- $submit_url = "http://www.phpx.com/happy/logging.php?action=login";
- $submit_vars["loginmode"] = "normal";
- $submit_vars["styleid"] = "1";
- $submit_vars["cookietime"] = "315360000";
- $submit_vars["loginfield"] = "username";
- $submit_vars["username"] = "********"; //你的用户名
- $submit_vars["password"] = "*******"; //你的密码
- $submit_vars["questionid"] = "0";
- $submit_vars["answer"] = "";
- $submit_vars["loginsubmit"] = "提 交";
- $snoopy->submit($submit_url,$submit_vars);
- print $snoopy->results;
- ?>
去年接触到PDO,也稍微了用了下。不过不熟悉,这次查看了手册,详细的看了看。手册上是英文的,顺便就翻译下。
PDO,全称PHP DATA OBJECTS,在PHP中定义了一个轻量级别的数据操作接口。在PHP5.1及其之后的版本中得到完全的支持。PDO,实现了事务、不同数据库之间的抽象。这是我最喜欢的原因。
安全PDO是非常简单的,也有很多文章,这里就不具体说了。
Read the rest of this entry »
- <?php
- //获得当前的脚本网址
- function get_php_url(){
- if(!empty($_SERVER["REQUEST_URI"])){
- $scriptName = $_SERVER["REQUEST_URI"];
- $nowurl = $scriptName;
- }else{
- $scriptName = $_SERVER["PHP_SELF"];
- if(empty($_SERVER["QUERY_STRING"])) $nowurl = $scriptName;
- else $nowurl = $scriptName."?".$_SERVER["QUERY_STRING"];
- }
- return $nowurl;
- }
- //把全角数字转为半角数字
- function GetAlabNum($fnum){
- $nums = array("0","1","2","3","4","5","6","7","8","9");
- $fnums = "0123456789";
- for($i=0;$i<=9;$i++) $fnum = str_replace($nums[$i],$fnums[$i],$fnum);
- $fnum = ereg_replace("[^0-9\.]|^0{1,}","",$fnum);
- if($fnum=="") $fnum=0;
- return $fnum;
- }
