PHP实现简单爬虫的方法

阅读次数:1571 次  |  发布时间:2019-02-04T00:00:00Z 

本文实例讲述了PHP实现简单爬虫的方法。分享给大家供大家参考。具体如下:


    <?php
    /**
     * 爬虫程序 -- 原型
     *
     * 从给定的url获取html内容
     * 
     * @param string $url 
     * @return string 
     */
    function _getUrlContent($url) {
      $handle = fopen($url, "r");
      if ($handle) {
        $content = stream_get_contents($handle, 1024 * 1024);
        return $content;
      } else {
        return false;
      } 
    } 
    /**
     * 从html内容中筛选链接
     * 
     * @param string $web_content 
     * @return array 
     */
    function _filterUrl($web_content) {
      $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
      $result = preg_match_all($reg_tag_a, $web_content, $match_result);
      if ($result) {
        return $match_result[1];
      } 
    } 
    /**
     * 修正相对路径
     * 
     * @param string $base_url 
     * @param array $url_list 
     * @return array 
     */
    function _reviseUrl($base_url, $url_list) {
      $url_info = parse_url($base_url);
      $base_url = $url_info["scheme"] . '://';
      if ($url_info["user"] && $url_info["pass"]) {
        $base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";
      } 
      $base_url .= $url_info["host"];
      if ($url_info["port"]) {
        $base_url .= ":" . $url_info["port"];
      } 
      $base_url .= $url_info["path"];
      print_r($base_url);
      if (is_array($url_list)) {
        foreach ($url_list as $url_item) {
          if (preg_match('/^http/', $url_item)) {
            // 已经是完整的url
            $result[] = $url_item;
          } else {
            // 不完整的url
            $real_url = $base_url . '/' . $url_item;
            $result[] = $real_url;
          } 
        } 
        return $result;
      } else {
        return;
      } 
    } 
    /**
     * 爬虫
     * 
     * @param string $url 
     * @return array 
     */
    function crawler($url) {
      $content = _getUrlContent($url);
      if ($content) {
        $url_list = _reviseUrl($url, _filterUrl($content));
        if ($url_list) {
          return $url_list;
        } else {
          return ;
        } 
      } else {
        return ;
      } 
    } 
    /**
     * 测试用主程序
     */
    function main() {
      $current_url = "http://hao123.com/"; //初始url
      $fp_puts = fopen("url.txt", "ab"); //记录url列表
      $fp_gets = fopen("url.txt", "r"); //保存url列表
      do {
        $result_url_arr = crawler($current_url);
        if ($result_url_arr) {
          foreach ($result_url_arr as $url) {
            fputs($fp_puts, $url . "\r\n");
          } 
        } 
      } while ($current_url = fgets($fp_gets, 1024)); //不断获得url
    } 
    main();
    ?>
    
    

希望本文所述对大家的php程序设计有所帮助。

最近发布的代码:

获取php时间戳 PHP 程序  |  7次阅读  | 发布于:2020-08-01T23:05:19Z
php获取tempfile路径 PHP 程序  |  7次阅读  | 发布于:2020-08-01T23:03:16Z
php 1,1,2,3,5,8,13,21,34...求第30位的数是多少? PHP 程序  |  11次阅读  | 发布于:2020-08-01T23:03:00Z
PHP执行shell PHP 程序  |  22次阅读  | 发布于:2020-02-08T16:48:28Z
PHP获取HTTP body内容 PHP 程序  |  53次阅读  | 发布于:2019-12-09T14:35:47Z
php读取目录下的所有文件 PHP 程序  |  59次阅读  | 发布于:2019-11-18T18:50:49Z
php判断是爬虫在访问还是用户浏览器在访问 PHP 程序  |  62次阅读  | 发布于:2019-11-12T19:16:47Z
PHP通过UserAgent识别爬虫 PHP 程序  |  49次阅读  | 发布于:2019-11-12T19:16:03Z
PHP使用curl发起post请求 PHP 程序  |  61次阅读  | 发布于:2019-11-10T21:43:33Z
PHP版HelloWorld PHP 程序  |  47次阅读  | 发布于:2019-10-31T00:14:24Z
实现水仙花数的5个示例 PHP 程序  |  83次阅读  | 发布于:2019-10-29T23:22:58Z
PHP输出所有位数的水仙花 PHP 程序  |  41次阅读  | 发布于:2019-10-28T08:44:36Z
PHP水仙花数实现代码 PHP 程序  |  45次阅读  | 发布于:2019-10-28T08:38:23Z
根据文件后缀判断是否为代码文件 PHP 程序  |  82次阅读  | 发布于:2019-10-20T14:39:03Z
PHP判断访问者是否为手机 PHP 程序  |  78次阅读  | 发布于:2019-10-20T14:37:38Z
PHP判断字符是否以xxx开头 PHP 程序  |  74次阅读  | 发布于:2019-10-10T01:55:24Z
PHP压缩文件 PHP 程序  |  100次阅读  | 发布于:2019-10-10T01:53:17Z
PHP解压文件 PHP 程序  |  43次阅读  | 发布于:2019-10-10T01:51:36Z
PHP生成随机字符串 PHP 程序  |  54次阅读  | 发布于:2019-10-10T01:49:40Z
PHP判断路径是否合法,不能有./ ../等安全隐患 PHP 程序  |  97次阅读  | 发布于:2019-10-10T01:48:56Z
PHP在服务端通过浏览器的User-Agent判断网页的客户端类型 PHP 程序  |  76次阅读  | 发布于:2019-10-10T01:26:15Z
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态 PHP 程序  |  1123次阅读  | 发布于:2019-02-04T00:00:00Z
WordPress的主题编写中获取头部模板和底部模板 PHP 程序  |  1084次阅读  | 发布于:2019-02-04T00:00:00Z
PHP实现批量清空删除指定文件夹所有内容的方法 PHP 程序  |  1041次阅读  | 发布于:2019-02-04T00:00:00Z
PHP面向对象继承用法详解(优化与减少代码重复) PHP 程序  |  989次阅读  | 发布于:2019-02-04T00:00:00Z
玩转虚拟域名◎+ . PHP 程序  |  909次阅读  | 发布于:2019-02-04T00:00:00Z
值得分享的php+ajax实时聊天室 PHP 程序  |  936次阅读  | 发布于:2019-02-04T00:00:00Z
PHP中使用substr()截取字符串出现中文乱码问题该怎么办 PHP 程序  |  933次阅读  | 发布于:2019-02-04T00:00:00Z
模仿OSO的论坛(二) PHP 程序  |  853次阅读  | 发布于:2019-02-04T00:00:00Z
sqlyog 中文乱码问题的设置方法 PHP 程序  |  859次阅读  | 发布于:2019-02-04T00:00:00Z

最多阅读的代码

 PHP分页显示制作详细讲解 PHP 程序  |  2116次阅读
 在Zeus Web Server中安装PHP语言支持 PHP 程序  |  1658次阅读
 再谈PHP中单双引号的区别详解 PHP 程序  |  1617次阅读
 PHP实现简单爬虫的方法 PHP 程序  |  1571次阅读
 php+ajax+json 详解及实例代码 PHP 程序  |  1568次阅读
 桌面中心(一)创建数据库 PHP 程序  |  1543次阅读
 PHP设计模式之工厂模式与单例模式 PHP 程序  |  1541次阅读
 php封装的page分页类完整实例 PHP 程序  |  1540次阅读
 php数组合并array_merge()函数使用注意事项 PHP 程序  |  1533次阅读
 Yii2汉字转拼音类的实例代码 PHP 程序  |  1512次阅读
 使用WAMP搭建PHP本地开发环境 PHP 程序  |  1383次阅读
 redirect_uri参数错误的解决方法(必看) PHP 程序  |  1371次阅读
 thinkPHP5.0框架简单配置作用域的方法 PHP 程序  |  1370次阅读
 php查询及多条件查询 PHP 程序  |  1369次阅读
 Zend Framework分发器用法示例 PHP 程序  |  1342次阅读
 php连接oracle数据库的方法(测试成功) PHP 程序  |  1341次阅读
 PHP实现根据银行卡号判断银行 PHP 程序  |  1340次阅读
 PHP Header用于页面跳转时的几个注意事项 PHP 程序  |  1330次阅读
 PHP 生成的XML以FLASH获取为乱码终极解决 PHP 程序  |  1325次阅读
 php封装一个异常的处理类 PHP 程序  |  1325次阅读
 ThinkPHP3.1新特性之Action参数绑定 PHP 程序  |  1321次阅读
 mantis安装、配置和使用中的问题小结 PHP 程序  |  1321次阅读
 PHP环境搭建最新方法 PHP 程序  |  1314次阅读