• PHP 实现小偷程序


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

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

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

            “小偷程序” 应该在 Windows 下的 DOS(参考文章:http://blog.csdn.net/liruxing1715/article/details/7079488) 或 Linux 下通过 PHP 命令运行为最佳,因为,网页运行会超时。

            比如图(Windows 下 DOS 为例):

            

    “小偷程序”的实现

            这里主要通过一个实例来讲解,我们来抓取下“华强电子网”的资讯信息,请先看观察这个链接 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)

    “华强电子网”资讯抓取

            首先,先建数据表结构,如下所示:

    [sql] view plaincopy
     
    1. CREATE TABLE `article`.`article` (  
    2. `id` MEDIUMINT( 8 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,  
    3. `title` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,  
    4. `date` VARCHAR( 50 ) NOT NULL ,  
    5. `author` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,  
    6. `source` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,  
    7. `content` TEXT NOT NULL  
    8. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;  

            抓取程序:
    [php] view plaincopy
     
    1. <?php  
    2. /** 
    3. * 抓取“华强电子网”资讯程序 
    4. * author Lee. 
    5. * Last modify $Date: 2012-1-3 15:39:35 $ 
    6. */  
    7. header('Content-Type:text/html;Charset=utf-8');  
    8. $mysqli = new mysqli('localhost', 'root', '1715544', 'article'); # 数据库连接,请手动修改您自己的数据库信息  
    9. $mysqli->set_charset('UTF8'); # 设置数据库编码  
    10. function data($url) {  
    11.     global $mysqli;  
    12.     $result = file_get_contents($url); # $result 获取 url 链接内容(注意:这里是文章列表链接)  
    13.     $pattern = '/<li><span class="box_r">.+</span><a href="([^"]+)"  title=".+" >.+</a></li>/Usi'; # 取得文章 url 的匹配正则  
    14.     preg_match_all($pattern, $result, $arr); # 把文章列表 url 分配给数组$arr(二维数组)  
    15.     foreach ($arr[1] as $val) {  
    16.         $val = 'http://www.hqew.com' . $val; # 真实文章 url 地址  
    17.         $re = file_get_contents($val); # $re 为文章 url 的内容  
    18.         $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'; # 取得文章内容的正则  
    19.         preg_match_all($pa, $re, $array); # 把取到的内容分配到数组 $array  
    20.         $content = trim($array[5][0]);   
    21.         $con = array(  
    22.                 'title'=>mysqlString($array[1][0]),  
    23.                 'date'=>mysqlString($array[2][0]),   
    24.                 'author'=>mysqlString(stripAuthorTag($array[3][0])),  
    25.                 'source'=>mysqlString($array[4][0]),   
    26.                 'content'=>mysqlString(stripContentTag($content))  
    27.             );  
    28.         $sql = "INSERT INTO article(title,date,author,source,content) VALUES ('{$con['title']}','{$con['date']}','{$con['author']}','{$con['source']}','{$con['content']}')";  
    29.         $row = $mysqli->query($sql); # 添加到数据库  
    30.         if ($row) {  
    31.             echo 'add success!';  
    32.         } else {  
    33.             echo 'add failed!';  
    34.         }  
    35.     }  
    36. }  
    37. /** 
    38.  * stripOfficeTag($v) 对文章内容进行过滤,比如:去掉文章中的链接,过滤掉没用的 HTML 标签…… 
    39.  * @param string $v 
    40.  * @return string 
    41.  */  
    42. function stripContentTag($v){  
    43.     $v = str_replace('<p> </p>', '', $v);  
    44.     $v = str_replace('<p />', '', $v);  
    45.     $v = preg_replace('/<a href=".+" target="\_blank"><strong>(.+)</strong></a>/Usi', '1', $v);  
    46.     $v = preg_replace('%(<spans*[^>]*>(.*)</span>)%Usi', '2', $v);  
    47.     $v = preg_replace('%(s+class="Mso[^"]+")%si', '', $v);  
    48.     $v = preg_replace('%( style="[^"]*mso[^>]*)%si', '', $v);  
    49.     $v = preg_replace('/<b></b>/', '', $v);  
    50.     return $v;  
    51. }  
    52.   
    53. /** 
    54.  * stripTitleTag($title) 对文章标题进行过滤 
    55.  * @param string $v 
    56.  * @return string 
    57.  */  
    58. function stripAuthorTag($v) {  
    59.     $v = preg_replace('/<a href=".+" target="\_blank">(.+)</a>/Usi', '1', $v);  
    60.     return $v;  
    61. }  
    62.   
    63. /** 
    64.  * mysqlString($str) 过滤数据 
    65.  * @param string $str 
    66.  * @return string 
    67.  */  
    68. function mysqlString($str) {  
    69.     return addslashes(trim($str));  
    70. }  
    71.   
    72. /** 
    73.  * init($min, $max) 入口程序方法,从 $min 页开始取,到 $max 页结束 
    74.  * @param int $min 从 1 开始 
    75.  * @param int $max 
    76.  * @return string 返回 URL 地址 
    77.  */  
    78. function init($min=1, $max) {  
    79.     for ($i=$min; $i<=$max; $i++) {  
    80.         data("http://www.hqew.com/info-c10-{$i}.html");  
    81.     }  
    82. }  
    83. init(1, 500);  // 程序入口,从第一页开始抓,抓取500页  
    84. ?>  

    通过上面的程序,就可以实现抓取华强电子网的资讯信息。

    入口方法 init($min, $max) 如果想抓取 1-500 页面内容,那么 init(1, 500) 即可!这样,用不了多长时间,华强电子网的资讯就会全部抓取到数据库里面了。^_^

    执行界面:

    数据库:

  • 相关阅读:
    Access 通用访问类 OleDbHelper
    让Visual Studio 也支持JS代码折叠 [ Visual Studio | #region | #endregion ]
    提高网站性能的方法
    php 正则表达式整理 归纳 重点
    C++数据结构知识点
    algorithm算法设计,数据结构基本概念之我的归纳 by whb_咸菜圣斗士啊斌斌斌斌
    浏览器兼容性问题及常见的解决方法
    js抽象方法的使用
    js制作图片轮换切换
    C语言排序算法总结
  • 原文地址:https://www.cnblogs.com/lygsbbs/p/4371620.html
Copyright © 2020-2023  润新知