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&amp;java(二)
Oct 09 PHP
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
Apr 20 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
解析MySql与Java的时间类型
Jun 22 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
PHP实现找出链表中环的入口节点
Jan 16 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 PHP
php下的原生ajax请求用法实例分析
Feb 28 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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
七年级地理教学反思
2014/01/26 职场文书
投资合作协议书范本
2014/04/17 职场文书
学生保证书
2015/01/16 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
工程主管竞聘书
2015/09/15 职场文书