PHP实现小偷程序实例


Posted in PHP onOctober 31, 2016

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

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

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

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

比如图(Windows 下 DOS 为例):

PHP实现小偷程序实例

“小偷程序”的实现

这里主要通过一个实例来讲解,我们来抓取下“华强电子网”的资讯信息,请先看观察这个链接 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) 即可!这样,用不了多长时间,华强电子网的资讯就会全部抓取到数据库里面了。^_^

执行界面:

PHP实现小偷程序实例

数据库:

PHP实现小偷程序实例

PHP 相关文章推荐
php 表单验证实现代码
Mar 10 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
php实现通过ftp上传文件
Jun 19 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 #PHP
利用php做服务器和web前端的界面进行交互
Oct 31 #PHP
php将服务端的文件读出来显示在web页面实例
Oct 31 #PHP
PDO的安全处理与事物处理方法
Oct 31 #PHP
PHP仿微信发红包领红包效果
Oct 30 #PHP
PHPCMS忘记后台密码的解决办法
Oct 30 #PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 #PHP
You might like
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
React Hooks的深入理解与使用
2018/11/12 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
Python中datetime模块参考手册
2017/01/13 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Flask配置Cors跨域的实现
2019/07/12 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
临床医学专业个人的自我评价
2013/09/27 职场文书
党员公开承诺书
2014/03/25 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL