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注入实例
Oct 09 PHP
php session 检测和注销
Mar 16 PHP
php中几种常见安全设置详解
Apr 06 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
php二维数组排序详解
Nov 06 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
Yii2框架BootStrap样式的深入理解
Nov 07 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
php获取手机端的号码以及ip地址实例代码
Sep 12 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 PHP
PHP实现文件上传操作和封装
Mar 04 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/10/29 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
php数据访问之查询关键字
2016/05/09 PHP
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
让 python 命令行也可以自动补全
2014/11/30 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
创新型城市实施方案
2014/03/06 职场文书
学生请假条
2014/04/11 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
会计实训报告范文
2014/11/04 职场文书
如何用python绘制雷达图
2021/04/24 Python