• 技术文章 >php教程 >PHP源码

    PHP实现简单爬虫

    PHP中文网PHP中文网2016-05-25 17:10:37原创424
    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();
     
    ?>
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP实现简单爬虫
    上一篇:新浪一道面试题:写一个函数,算出两个文件的相对路径。 下一篇:php编写的mysql 操作类 php5的
    千万级数据并发解决方案

    相关文章推荐

    • PHP实现301跳转,及延时跳转代码• PHP常用用的六个处理正则表达式函数• php 值得收藏的常用类汇总• php 完整图片按比例生成缩略图代码• php 生成随机函数
    1/1

    PHP中文网