今天试用了一下百度云平台(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