多数大学生出来选择的工作和专业无关
首页 > 专业知识

巧妙运用PHP函数实现采集器

时间:2018-06-20 19:46:40 [来源]:郑州PHP培训学校

   巧妙运用PHP函数实现采集器

  文章这里巧妙利用PHP函数中的file_get_contents()和preg_match_all()实现采集器,希望对大家有帮助。
  PHP经过长时间的发展,很多用户都很了解PHP了,我们现在可以利用PHP函数实现采集器程序。何为采集器,通常又叫小偷程序,主要是用来抓取别人网页内容的。关于采集器的制作,其实并不难,就是远程打开要采集的网页,然后用正则表达式将需要的内容匹配出来,只要稍微有点正则表达式的基础,都能做出自己的采集器来的。
  前几天做了个小说连载的程序,因为怕更新麻烦,顺带就写了个采集器,采集八路中文网的,功能比较简单,不能自定义规则,不过大概思路都在里面了,自定义规则可以自己来扩展。用php来做采集器主要用到两个PHP函数:file_get_contents()和preg_match_all(),前一个是远程读取网页内容的,不过只在php5以上的版本才能用,后一个是正则函数,用来提取需要的内容的。面就一步一步来讲功能实现。因为是采集小说,所以首先要将书名、作者、类型这三个提取出来,别的信息可根据需要提取。
  这样还不够,还需要一个切取PHP函数:
  function cut($string,$start,$end){
  $message = explode($start,$string);
  $message = explode($end,$message[1]); return $message[0];}其中$string为要被切取的内容,$start为开始的地方,$end为结束的地方。取出分类号:
  $start = "Html/Book/";
  $end
  = "List.shtm";
  $typeid = cut($typeid[0][0],$start,$end);$typeid = explode("/",$typeid);[/php]
  这样,$typeid[0]就是我们要找的分类号了。方法如下:
  $ustart = "\"";
  $uend
  = "\"";
  //t表示title的缩写
  $tstart = ">";
  $tend
  = "<";
  //取路径,例如:123.shtm,2342.shtm,233.shtmpreg_match_all("/\"[0-9]{1,}\.(shtm)\"/is",$chapterurl,$url);//取标题,例如:第一章 九世善人
  preg_match_all("/<a href=\"[0-9]{1,}\.shtm\"(.*?)\<\/a>/is",$file,$title);$countcountcount = count($url[0]);
  for($i=0;$i<=$count;$i++)
  {
  $u = cut($url[0][$i],$ustart,$uend);
  $t = cut($title[0][$i],$tstart,$tend);
  $array[$u] = $t;
  }
  $array数组就是所有的章节地址了,到这里,采集器就完成一半了,剩下的就是循环打开每个章节地址,读取,然后将内容匹配出来。这个比较简单,这里就不详细叙述了。
 
  常见PHP数据库解决方案
  文章这里揭秘了常见PHP数据库问题的解决方案,直接使用 MySQL、不使用自动增量功能,希望对大家有帮助。
  我们在使用PHP连接数据库的时候会遇到很多问题,文章这里揭露 PHP 应用程序中出现的常见数据库问题 —— 包括数据库模式设计、数据库访问和使用数据库的业务逻辑代码 —— 以及它们的解决方案。如果只有一种 方式使用数据库是正确的。您可以用很多的方式创建PHP数据库设计、数据库访问和基于数据库的 PHP 业务逻辑代码,但最终一般以错误告终。本文说明了数据库设计和访问数据库的 PHP 代码中出现的五个常见问题,以及在遇到这些问题时如何修复它们。
  PHP数据库问题 1:直接使用 MySQL
  一个常见问题是较老的 PHP 代码直接使用 mysql_ 函数来访问数据库。清单 1 展示了如何直接访问数据库。
  清单 1. Access/get.php
  <?php
  function get_user_id( $name )
  {
  $db = mysql_connect( 'localhost', 'root', 'password' );mysql_select_db( 'users' );
  $res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }
  return $id;
  }
  var_dump( get_user_id( 'jack' ) );
  ?>
  注意使用了 mysql_connect 函数来访问数据库。还要注意查询,其中使用字符串连接来向查询添加 $name 参数。该技术有两个很好的替代方案:PEAR DB 模块和 PHP Data Objects (PDO) 类。两者都从特定数据库选择提供抽象。因此,您的代码无需太多调整就可以在 IBM? DB2?、MySQL、PostgreSQL 或者您想要连接到的任何其他数据库上运行。使用 PEAR DB 模块和 PDO 抽象层的另一个价值在于您可以在 SQL 语句中使用 ? 操作符。这样做可使 SQL 更加易于维护,且可使您的应用程序免受 SQL 注入攻击。
  清单 2. Access/get_good.php
  <?php
  require_once("DB.php");
  function get_user_id( $name )
  {
  $dsn = 'mysql://root:password@localhost/users';$db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->getMessage()); }
  $res = $db->query( 'SELECT id FROM users WHERE login=?',array( $name ) );$id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }
  return $id;
  }
  var_dump( get_user_id( 'jack' ) );
  ?>
  注意,所有直接用到 MySQL 的地方都消除了,只有 $dsn 中的数据库连接字符串除外。此外,我们通过 ? 操作符在 SQL 中使用 $name 变量。然后,查询的数据通过 query() 方法末尾的 array 被发送进来。
  PHP数据库问题 2:不使用自动增量功能
  与大多数现代数据库一样,MySQL 能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个 SELECT 语句来找到最大的 id,然后将该 id 增 1,并找到一个新记录。清单 3 展示了一个示例坏模式。
  清单 3. Badid.sql
  DROP TABLE IF EXISTS users;
  CREATE TABLE users (
  id MEDIUMINT,
  login TEXT,
  password TEXT
  );
  INSERT INTO users VALUES ( 1, 'jack', 'pass' );INSERT INTO users VALUES ( 2, 'joan', 'pass' );INSERT INTO users VALUES ( 1, 'jane', 'pass' );这里的 id 字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如 CREATE 语句后面的几个 INSERT 语句中所示。清单 4 展示了将用户添加到这种类型的模式的 PHP 代码。
  全面学习PHP数组初始化原理
  如何显示数组中的各元素的值,我们则是使用从0开始的索引,索引号在变量名称后的方括号中,文章详细的介绍了PHP数组初始化。
  PHP功能的强大,运用它的人也越来越多,我们这里就PHP数组初始化给大家详细的介绍下。从ASP初入门到PHP,感觉到PHP的强大之一就是内置函数的丰富,比如先前学习的PHP日期时间函数,读写文件的相关函数等都无不表明了PHP的更专业、更令用户的使用得心应手。
  一开始我对PHP函数的丰富功能很兴奋,随着对越来越多近乎变态多的函数接触之后,突然联想到了ASP内置函数的稀少,要完成某项特殊功能,常须自定义函数,随着应用的在增多,自己居然也有了一套常用的函数库。然而现在在PHP中,这些功能早已被标准化、规范化而浓缩为内置函数直接使用,曾经的ASP开发人员成为了PHP的普通用户。
  但转念一想,这些函数、这些大量PHP函数的存在,至少说明了PHP的更专业;同时,在我们日常PHP程序处理时应该是很快捷易用的吧,这让开发人员不再为些基础功能、细节功能而去自定义函数,把主要的精力集中在组建更强大的程序模块上。所以,我更加坚定了一看PHP函数到底的信念,不过我想在以后的开发过程中,PHP函数手册应该属于随身书了。当然,关于ASP和PHP孰优孰劣的争论就无需多讨论,学习并了解能让自己了解真相。言正传,PHP函数太多,防止遗忘,所以每次看完一类函数后我都做个总结和收集工作,方便起见就写篇日志。
  PHP数组初始化和定义
  什么是数组?数组是一种编程结构,它是一个存储一组或一系列数值的变量。比如人口普查时对个人的身份登记,如姓名、性别、民族、出生等就可作为数组。PHP中创建数组使用array()结构来定义,PHP数组初始化比如:
  $people=array('name','sex','nation','brith');而如何显示数组中的各元素的值,我们则是使用从0开始的索引,索引号在变量名称后的方括号中,比如:
  <?php
  $people=array('name','sex','nation','birth');echo $people[2];
  ?>
  输出的$people[2]就是显示的是nation(索引第一项从0计数)。PHP除了支持数字索引数组以外,还支持相关数组。所谓相关数组,就是可自定义关键字来替换不直观的数字索引,比如:
  <?php
  $peoples=array('xm'=>'name','xb'=>'sex','mz'=>'nation','cs'=>'birth');echo $peoples['cs'];
  ?>
  使用相关数组使得输出的选择很直观(不需要预先计算索引号然后输出),定义的关键字和值之间使用“=>”符号定义。根据PHP数组元素的两种显示方式,还可以如变量一样无需array()声明和初始化,直接自动创建数字。比如$people[0]='name';
  $people[1]='sex';
  $people[2]='nation';
  $people[3]='brith';
  或者
  $peoples['xm']='name';
  $peoples['xb']='sex';
  $peoples['mz']='nation';
  $peoples['cs']='birth';
  该数组的大小根据所增加元素的多少动态的变化。
 

上一篇:快速掌握PHP数组循环取数据技巧

下一篇:PHP程序员易忽略的PHP精华和技巧