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 相关文章推荐
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
Dec 25 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
Jun 19 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
PHP获取文件相对路径的方法
Feb 26 PHP
浅谈json_encode用法
Mar 05 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
PHP实现清除MySQL死连接的方法
Jul 23 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
PHP实现微信申请退款功能
Oct 01 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 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 分页原理详解
2009/08/21 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
js螺旋动画效果的具体实例
2013/11/15 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
Python实现统计单词出现的个数
2015/05/28 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
python微信撤回监测代码
2019/04/29 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
python基于win32api实现键盘输入
2020/12/09 Python
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
责任心演讲稿
2014/05/14 职场文书
地方白酒代理协议书
2014/10/25 职场文书
怎么写工作检讨书
2014/11/16 职场文书
幼儿园教师求职信
2015/03/20 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
小学思想品德教学反思
2016/02/24 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python