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 相关文章推荐
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
php输出xml必须header的解决方法
Oct 17 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
PHP文件操作方法汇总
Jul 01 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
PHP微信支付实例解析
Jul 22 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 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
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
Ext grid 添加右击菜单
2009/11/26 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
tab栏切换原理
2017/03/22 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
python实现低通滤波器代码
2020/02/26 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
利用python爬取有道词典的方法
2020/12/08 Python
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
《燕子专列》教学反思
2014/02/21 职场文书
金融与证券专业求职信
2014/06/22 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
涨价通知怎么写
2015/04/23 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
Go timer如何调度
2021/06/09 Golang