Cloud App -- Baidu App Engine爬蟲應用開發

        今天試用了一下百度雲平臺(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章