PHP实现小偷程序实例

为什么使用“小偷程序”?

远程抓取文章资讯或商品信息是很多企业要求程序员实现的功能,也就是俗说的小偷程序。其最主要的优点是:解决了公司网编繁重的工作,大大提高了效率。只需要一运行就能快速的抓取别人网站的信息。

“小偷程序”在哪里运行?

“小偷程序” 应该在 Windows 下的 DOS或 Linux 下通过 PHP 命令运行为最佳,因为,网页运行会超时。

比如图(Windows 下 DOS 为例):

“小偷程序”的实现

这里主要通过一个实例来讲解,我们来抓取下“华强电子网”的资讯信息,请先看观察这个链接 http://www.hqew.com/info-c10.html,当您打开这个页面的时候发现这个页面会发现一些现象:

1、资讯列表有 500 页(2012-01-03);

2、每页的 url 链接都有规律,比如:第1页为http://www.hqew.com/info-c10-1.html;第2页为http://www.hqew.com/info-c10-2.html;……第500页为http://www.hqew.com/info-c10-500.html

3、由第二点就可以知道,“华强电子网” 的资讯是伪静态或者是生成的静态页面

其实,基本上大部分的网站都有这样的规律,比如:中关村在线、慧聪网、新浪、淘宝……。

这样,我们可以通过这样的思路来实现页面内容的抓取:
1、先获取文章列表页内容;
2、根据文章列表页内容循环获取文章的 url 地址;
3、根据文章的 url 地址获取文章的详细内容

这里,我们主要抓取资讯页里面的:标题(title)、发布如期(date)、作者(author)、来源(source)、内容(content)

“华强电子网”资讯抓取

首先,先建数据表结构,如下所示:

CREATE TABLE `article`.`article` (
`id` MEDIUMINT( 8 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`date` VARCHAR( 50 ) NOT NULL ,
`author` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`source` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` TEXT NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; 

抓取程序:

<?php
/**
* 抓取“华强电子网”资讯程序
* author Lee.
* Last modify $Date: 2012-1-3 15:39:35 $
*/
header('Content-Type:text/html;Charset=utf-8');
$mysqli = new mysqli('localhost', 'root', '1715544', 'article'); # 数据库连接,请手动修改您自己的数据库信息
$mysqli->set_charset('UTF8'); # 设置数据库编码
function data($url) {
  global $mysqli;
  $result = file_get_contents($url); # $result 获取 url 链接内容(注意:这里是文章列表链接)
  $pattern = '/<li><span class="box_r">.+<\/span><a href="([^"]+)" title=".+" >.+<\/a><\/li>/Usi'; # 取得文章 url 的匹配正则
  preg_match_all($pattern, $result, $arr); # 把文章列表 url 分配给数组$arr(二维数组)
  foreach ($arr[1] as $val) {
    $val = 'http://www.hqew.com' . $val; # 真实文章 url 地址
    $re = file_get_contents($val); # $re 为文章 url 的内容
    $pa = '/<div id="article">\s+<h1>(.+)<\/h1>\s+<p id="article\_extinfo">\s+发布:\s+(.+)\s+\|\s+作者:\s+(.+)\s+\|\s+来源:\s+(.*?)\s+<span style="display:none" >.+<div id="article_body">\s*(.+)\s+<\/div>\s+<\/div><!--article end-->/Usi'; # 取得文章内容的正则
    preg_match_all($pa, $re, $array); # 把取到的内容分配到数组 $array
    $content = trim($array[5][0]);
    $con = array(
        'title'=>mysqlString($array[1][0]),
        'date'=>mysqlString($array[2][0]),
        'author'=>mysqlString(stripAuthorTag($array[3][0])),
        'source'=>mysqlString($array[4][0]),
        'content'=>mysqlString(stripContentTag($content))
      );
    $sql = "INSERT INTO article(title,date,author,source,content) VALUES ('{$con['title']}','{$con['date']}','{$con['author']}','{$con['source']}','{$con['content']}')";
    $row = $mysqli->query($sql); # 添加到数据库
    if ($row) {
      echo 'add success!';
    } else {
      echo 'add failed!';
    }
  }
}
/**
 * stripOfficeTag($v) 对文章内容进行过滤,比如:去掉文章中的链接,过滤掉没用的 HTML 标签……
 * @param string $v
 * @return string
 */
function stripContentTag($v){
  $v = str_replace('<p> </p>', '', $v);
  $v = str_replace('<p />', '', $v);
  $v = preg_replace('/<a href=".+" target="\_blank"><strong>(.+)<\/strong><\/a>/Usi', '\1', $v);
  $v = preg_replace('%(<span\s*[^>]*>(.*)</span>)%Usi', '\2', $v);
  $v = preg_replace('%(\s+class="Mso[^"]+")%si', '', $v);
  $v = preg_replace('%( style="[^"]*mso[^>]*)%si', '', $v);
  $v = preg_replace('/<b><\/b>/', '', $v);
  return $v;
} 

/**
 * stripTitleTag($title) 对文章标题进行过滤
 * @param string $v
 * @return string
 */
function stripAuthorTag($v) {
  $v = preg_replace('/<a href=".+" target="\_blank">(.+)<\/a>/Usi', '\1', $v);
  return $v;
} 

/**
 * mysqlString($str) 过滤数据
 * @param string $str
 * @return string
 */
function mysqlString($str) {
  return addslashes(trim($str));
} 

/**
 * init($min, $max) 入口程序方法,从 $min 页开始取,到 $max 页结束
 * @param int $min 从 1 开始
 * @param int $max
 * @return string 返回 URL 地址
 */
function init($min=1, $max) {
  for ($i=$min; $i<=$max; $i++) {
    data("http://www.hqew.com/info-c10-{$i}.html");
  }
}
init(1, 500); // 程序入口,从第一页开始抓,抓取500页
?>

通过上面的程序,就可以实现抓取华强电子网的资讯信息。

入口方法 init($min, $max) 如果想抓取 1-500 页面内容,那么 init(1, 500) 即可!这样,用不了多长时间,华强电子网的资讯就会全部抓取到数据库里面了。^_^

执行界面:

数据库:

(0)

相关推荐

  • php array_pop 删除数组最后一个元素实例

    php array_pop函数将数组最后一个单元弹出(出栈),即删除数组的最后一个元素.本文章通过php实例向大家讲解array_pop函数的使用方法. array_pop - 将数组最后一个单元弹出(出栈) 说明 mixed array_pop ( array &$array ) array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一.如果 array 为空(或者不是数组)将返回 NULL . 此外如果被调用不是一个数则会产生一个 Warning.

  • PHP递归获取目录内所有文件的实现方法

    如下所示: /** * 递归获取文件夹内所有文件 * 返回一个TREE结构的文件系统 * @param string $dir * @param array $filter * @return array $files */ function scan_dir($dir, $filter = array()){ if(!is_dir($dir))return false; $files = array_diff(scandir($dir), array('.', '..')); if(is_ar

  • 利用php做服务器和web前端的界面进行交互

    PHP与Web页面交互是实现PHP网站与用户交互的重要手段.希望查看本篇文章的学者首先查看一下PHP的基础知识,因为今天用到这个东西,现学现卖吧.后续会更新php服务器的基础知识! 1.首先你要有一个界面   我这里利用我项目开发的一个简单界面截取下来进行讲解!项目机密  请勿**,你懂得! html代码和界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or

  • php数组函数序列之array_pop() - 删除数组中的最后一个元素

    array_pop()定义和用法 array_pop() 函数删除数组中的最后一个元素. 语法 array_pop(array)参数 描述 array 必需.规定输入的数组参数. 例子 复制代码 代码如下: <?php $a=array("Dog","Cat","Horse"); array_pop($a); print_r($a); ?> 输出: Array ( [0] => Dog [1] => Cat )

  • PHPCMS忘记后台密码的解决办法

    什么是PHPCMS? PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计.开发与维护.它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各种规模的网站需求,可靠性高,是一款具备文章.下载.图片.分类信息.影视.商城.采集.财务等众多功能的强大.易用.可扩展的优秀网站管理软件. PHPCMS后台密码忘记解决办法,本文主要是从技术角度去解决的,请细看正文. 1. 密码忘记就得先找到加密的方法了 1.1 PHPCMS密码只能重试8次,超过重

  • php将服务端的文件读出来显示在web页面实例

    本篇文章的内容我将告诉你如何应用php将服务端的文件读出来显示在web页面. 现有保存在服务端的文件orders.txt,内容为: 现创建vieworder.PHP文件,将其读出并显示; <?php $DOCUMENT_ROOT =$_SERVER['DOCUMENT_ROOT']; ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>客户订

  • PHP之十六个魔术方法详细介绍

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或empty(

  • PHP仿微信发红包领红包效果

    近期项目需要在聊天的基础上新增红包功能,需求:仿微信(不含留言),但只能使用余额发红包.于是多次使用微信红包,了解各种交互界面及业务需求,如展示信息.分类(个人,群普通,群拼手气).个数限制(100).金额限制(200).过期时间(24小时)等等,然后着手开发,下面提及的基本全是提供给app端的接口,毕竟我是phper. 一.设计数据表如下 CREATE TABLE `red_packet` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `us

  • php array_pop()数组函数将数组最后一个单元弹出(出栈)

    复制代码 代码如下: <?php /*函数array_pop():将数组最后一个单元弹出(出栈) * 1.语法:mixed array_pop ( array &array ) * 2.描述: 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一.如果 array 为空(或者不是数组)将返回 NULL. * 3.注意事项: * 3.1. */ echo "****************************************************

  • php 实现一个字符串加密解密的函数实例代码

    php 实现一个字符串加密解密的函数 函数代码如下: /********************************************************************* 函数名称:encrypt 函数作用:加密解密字符串 使用方法: 加密 :encrypt('str','E','nowamagic'); 解密 :encrypt('被加密过的字符串','D','nowamagic'); 参数说明: $string :需要加密解密的字符串 $operation:判断是加密还

  • PHP用户验证和标签推荐的简单使用

    本文给大家讲解一些最简单的验证知识.大家可以先看下效果图,如果大家感觉还不错,请参考实现代码. 效果图 bookmark_fns.php <?php require_once('output_fns.php'); require_once('db_fns.php'); require_once('data_valid_fns.php'); require_once('url_fns.php'); require_once('user_auth_fns.php'); ?> data_valid_

随机推荐