热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP实现的一个简单的爬虫

:本篇文章主要介绍了PHP实现的一个简单的爬虫,对于PHP教程有兴趣的同学可以参考一下。
这个小爬虫的功能是抓取目标网页的url,并实现递归爬。这个小demo是参照网友的代码然后自己改了一下,由于网上版本太多,我就不@原来的作者了(我不知道谁才是真正的作者)

下面是代码:

//爬虫类classCrawler{private$url;
    publicfunction__construct($url){if(!preg_match("/^(http)s?/", $url)){
            $url = "http://".$url;
        }
        $this->url = $url;
    }
    //从给定的url中获取html内容protectedfunction_getUrlContent($url){
        @$handle = fopen($url, "r");
        if(error_get_last()){//捕获异常(不一定是错误)$err = newException("你的URL好像不对!要不换一个?");
            echo$err->getMessage();
            return;
        }
        if($handle){
            $content = stream_get_contents($handle,1024*1024);//将资源流读入字符串return$content;
        }else{
            returnfalse;
        }   
    }
    //从html内容中筛选链接protectedfunction_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];
        }
    }
    //判断是否是完整的urlprotectedfunction_judgeURL($url){$url_info = parse_url($url);
        if(isset($url_info['scheme'])||isset($url_info['host'])){
            returntrue;
        }
        returnfalse;
    }
    //修正相对路径protectedfunction_reviseUrl($base_url,$url_list){$url_info = parse_url($base_url);//分解url中的各个部分unset($base_url);
        $base_url = isset($url_info["scheme"])?$url_info["scheme"].'://':"";//$url_info["scheme"]为http、ftp等if(isset($url_info["user"]) && isset($url_info["pass"])){//记录用户名及密码的url$base_url .= $url_info["user"].":".$url_info["pass"]."@";
        }
        $base_url .= isset($url_info["host"])?$url_info["host"]:"";//$url_info["host"]域名if(isset($url_info["port"])){//$url_info["port"]端口,8080等$base_url .= ":".$url_info["port"];
        }
        $base_url .= isset($url_info["path"])?$url_info["path"]:"";//$url_info["path"]路径//目前为止,绝对路径前面已经组装完if(is_array($url_list)){
            foreach ($url_listas$url_item) {
                // if(preg_match('/^(http)s?/',$url_item)){if($this->_judgeURL($url_item)){
                    //已经是完整的url$result[] = $url_item;
                }else {
                    //不完整的url$real_url = $base_url.$url_item;
                    $result[] = $real_url;
                }
            }
            return$result;
        }else {
            return;
        }
    }
    //爬虫publicfunctioncrawler(){$content = $this->_getUrlContent($this->url);
        if($content){
            $url_list = $this->_reviseUrl($this->url,$this->_filterUrl($content));
            if($url_list){
                return$url_list;
            }else {
                return ;
            }
        }else{
            return ;
        }
    }
}


$fp_puts = fopen("url.txt","ab");//记录url列表$fp_gets = fopen("url.txt","r");//保存url列表$current_url = "www.baidu.com";
do{
    $Crawler = new Crawler($current_url);
    $url_arr = $Crawler->crawler();
    if($url_arr){
        foreach ($url_arras$url) {
            fputs($fp_puts,$url."\n");
        }
    }
}while ($current_url = fgets($fp_gets,1024));//不断获得url// echo "
";// var_dump($url_arr);// echo "
";?>

由于在循环的时候要new的对象可能会很多,当时想的是用单例模式解决,以免内存开销太大,后来嫌麻烦就不了了之了。。。。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    以上就介绍了PHP实现的一个简单的爬虫,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

  • 推荐阅读
    • HTML前端开发:UINavigationController与页面间数据传递详解
      本文详细介绍了如何在HTML前端开发中利用UINavigationController进行页面管理和数据传递,适合初学者和有一定基础的开发者学习。 ... [详细]
    • Bootstrap Paginator 分页插件详解与应用
      本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
    • MySQL Administrator: 监控与管理工具
      本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
    • Bootstrap 插件使用指南
      本文详细介绍了如何在 Web 前端开发中使用 Bootstrap 插件,包括自动触发插件的方法、插件的引用方式以及具体的实例。 ... [详细]
    • 深入解析Unity3D游戏开发中的音频播放技术
      在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
    • 本文提供了处理WordPress网站中出现过多重定向问题的方法,包括检查DNS配置、安装SSL证书以及解决数据库连接错误等步骤。 ... [详细]
    • 解决ADODB连接Access时出现80004005错误的方法
      本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
    • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
    • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
    • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
    • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
      Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
    • 3DSMAX制作超现实的体育馆模型
      这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
    • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
    • JavaScript 页面卸载事件详解 (onunload)
      当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
    • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
    author-avatar
    我才不要喜欢你了
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有