Baidu App Engine爬虫应用开发

长平狐 发布于 2013/01/05 18:17
阅读 906
收藏 1

        今天试用了一下百度云平台(http://yun.baidu.com/)的云环境Baidu App Engine(以下简称BAE),整体感觉还不错(毕竟是互联网巨头的产品啊)。整体使用类似Google的GAE和Sina的SAE,但是也做了依托搜索平台和海量数据过滤检索的特性。

        本人使用其中的Mysql-分布式数据库服务,FetchUrl-Url抓取服务,Taskqueue-分布式队列服务。因为考虑分析url,fetch操作,故选择PHP作为BAE的开发语言。为了试手,简单的写了一个递归爬取Url的蜘蛛程序(BaeSpider),功能就是通过种子Url,通过,搜索链接,归并入数据库:

        1、同步抓取 : spider.php从数据库抓取一个种子Url -> 通过FetchUrl抓取content(递归抓取) -> 通过regex分析出所有链接 -> 对每个分析出的url在数据库中进行归并索引 -> 将hit次数、httpcode等信息写回

        2、异步抓取 : 从数据库抓取一个种子Url -> 种入Taskqueue队列 -> Taskqueue任务并发(此处并发不宜太高,因数据库链接有限)回调spider.php -> 通过FetchUrl抓取content -> 通过regex分析出所有链接 -> 对每个分析出的url在数据库中进行归并索引 -> 将hit次数、httpcode等信息写回。

           /**
            *  if we set ?url='http://www.sina.com.cn' like this , use it dierctly !
            *  otherwise we fetch a record from mysql
            */
            if (isset($arr['url']))
                    $url = $arr['url'];
            else
                    $url = $this->mysql_spld_random();

            while($this->fetch_loop_max && $this->fetch_loop_max_retry) {
                    $content = $this->fetch_url($url);
                    if ($content) {
                        // analyz all url from content
                        preg_match_all("/http:\/\/([\w-]+\.)*(com|net|org|gov|cc|biz|info|cn)(\.(cn|hk))*/",$content,$regex_urls);
                        foreach($regex_urls[0] as $value)
                            if (!in_array($value,$this->urls) && substr_count($value,'.')>=2)
                                array_push($this->urls,$value);
                        $this->fetch_loop_max--;
                    } else {
                        $this->fetch_loop_max_retry--;
                        $url = $this->mysql_spld_random();
                    }
                    // if we have crawled some urls , use them .
                    $url = count($this->urls) ? $this->urls[array_rand($this->urls)] : $this->mysql_spld_random();
            }
            if (count($this->urls))
                foreach ($this->urls as $value)
                    $this->mysql_spld_link_incr($value);
           
            mysql_close($con);
                    
            if ($show) {
                echo count($this->urls)." urls crawled : <br />\n";
                echo $this->output;
            }        


       通过并发抓取的大量url及各个url信息,可以记录它们的domain、http_cdoe、被链次数、pagerank(从alexa查询)等,再可以进行排名,或者得到一些热链和死链。

       总结:

               开发BaeSpider目的是为了简单应用一下BAE,并初步简单实现蜘蛛的雏形,还有很多需要完善之处。以后会通过其他服务(如类似GAE的Cron和Rank服务,猜想可能会开发吧)提供更多功能。现只提供了简单的url抓取功能,以后会考虑加入其他任务使得蜘蛛能够从content中获取更多的内容进行分析和展现。

        给出BAESpider的链接 :

       查询死链 : spider.duapp.com/?action=query404

       查询热链 : spider.duapp.com/?action=query


原文链接:http://blog.csdn.net/gugemichael/article/details/7485914
加载中
返回顶部
顶部