thinkphp實現采集功能的三種方法!


 最近在做一些數據分析,由於上網找數據比較麻煩,所以寫了一個采集網站數據的方法。具體方法如下:

方法一:QueryList

個人感覺比較好用,采集詳情比較不錯的選擇,但是采集復雜一點的列表,不好用。具體使用:

控制器示例:

public function index(){
    // 使用采集類
    // 使用手冊 :http://www.php.cn/php/php-QueryList3-ThinkPHP.html
    import('Org.QL.QueryList');
    $url = "http://www.zyctd.com/gqqg/";
    $reg = array();
    $reg['title'] = array('.sulist_title','text');
    $reg['shuliang'] = array('.su_li1','html');
    $obj = new \QueryList($url,$reg);
    $data = $obj->jsonArr;
    // foreach($data as $v){
    //     echo "<br>".$v['title'].'___'.$v['shuliang']."<br>";
    // }
    p($data);
}

方法二:simple_html_dom 

這個方法比較適合采集一點結構簡單的頁面,HTML標簽的類名比較明確的頁面,還不錯。具體使用:

控制器示例:

public function index(){
    // 參考文檔:http://microphp.us/plugins/public/microphp_res/simple_html_dom/manual.htm#section_quickstart
    // 下載地址:https://github.com/samacs/simple_html_dom/edit/master/simple_html_dom.php
    // 使用方法:http://www.thinkphp.cn/topic/21635.html
    import("Org.Util.simple_html_dom", '', '.php');
    $html = file_get_html('http://www.zyctd.com/gqqg/');
    $ret = $html->find('.supply_list_box ul',0)->first_child();
    foreach($ret as $v){
        echo $v;
    };
}

第三種:獲取頁面HTMl,進行正則匹配采集

舉例一個Demo:

采集一個頁面:

http://www.zyctd.com/gqqg/

我要獲取上面的四個信息:標題,數量,時間,跳轉鏈接

獲取這些信息,通過上面兩種方法都采集不到,最后才選用的正則來采集。具體方法:

public function index(){
    $url = "http://www.zyctd.com/gqqg/";
    // http://www.zyctd.com/gqqg-p1.html
    $supplyDB = M('supply');    
    $urlList = array();
    $array = array();
    for($x=1; $x<=1; $x++) {
        array_push($urlList,"http://www.zyctd.com/gqqg-p".$x.".html");
    };        
    foreach($urlList as $v){
        $curPageList = $this->getInfo($v);
        array_push($array,$curPageList);
    };
    foreach($array as $v){
        foreach($v as $vv){
            //echo $vv['title']."__".$vv['weight']."__".$vv['time']."<br>";
            $data = array();
            $data['title'] = $vv['title'];
            $data['weight'] = $vv['weight'];
            $data['add_time'] = $vv['add_time'];
            $data['url'] = $vv['url'];
            //$res = $supplyDB->add($data);
            //echo $res;
            echo "<p><span style='display:inline-block; width:110px;'>".$vv['title']."</span><span style='display:inline-block; width:110px;'>".$vv['weight']."</span><span style='display:inline-block; width:110px;'>".$vv['add_time']."</span><span style='display:inline-block; width:110px;'>".$vv['url']."</span></p>";
        }
    }
        // 獲取信息
        //$curPageList = $this->getInfo($html);
        //p($curPageList);
}
private function getInfo($url){
    $html = $this->getHtml($url);
    $array = array();
    // 匹配所有的標題
    preg_match_all("#<divclass=\"sulist_title\"><i></i><span>(.*?)</span></div>#",$html,$matches);
    $all_title = $matches[1];
    preg_match_all("#<i>發布時間:</i><span>(.*?)</span>#",$html,$matches);
    // 匹配所有的發布時間
    $all_time = $matches[1];
    // 匹配所有的求購數量
    preg_match_all("#<i>求購數量:</i><span>(.*?)</span>#",$html,$matches);
    $all_weight = $matches[1];
    // 匹配跳轉鏈接
    preg_match_all("#<atarget=\"_blank\"href=\"(.*?)\">#",$html,$matches);
    $all_url = $matches[1];
    // 組合
    foreach($all_title as $k => $v){
        $arr = array();
        $arr['title'] = $v;
        $arr['weight'] = $all_weight[$k];
        $arr['add_time'] = $all_time[$k];
        $arr['url'] = $all_url[$k];
        array_push($array,$arr);
    }
    return $array;
}
private function getHtml($url){
    $html = file_get_contents($url);
    $html = preg_replace("#\n#","",$html);
    $html = preg_replace("#\r#","",$html);
    $html = preg_replace("#\\s#","",$html);
    return $html;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM