最近在做一些數據分析,由於上網找數據比較麻煩,所以寫了一個采集網站數據的方法。具體方法如下:
方法一: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; }