網貸之家的爬蟲之旅

純潔的微笑發表於2015-04-14

[導讀]  因為本人公司正處於P2P的行業,分析行業資料,對平臺的運營決策有著很大的作用,因此需要爬網貸之家的相關資料。

1、分析

       通過右鍵檢視頁面原始碼發現頁面結構為表格佈局,因此設想可以分為四個步驟來採集資料:

      1、使用爬蟲將頁面抓取下來;

      2、對頁面資料進行解析;

      3、入庫(mysql);

      4、寫個定時服務每天定時抓取。

      因為公司網站使用PHP,最近也學習了一點,curl非常適合用來爬去網頁,決定用PHP程式進行抓取。

image

2、抓取頁面

       網貸之家有一個資料的二級域名,展示所有接入的P2P公司的各種成交資料,輸入日期可以查詢對應日期的資料(http://shuju.wangdaizhijia.com/indexs-0-0-0-400-0-0.html?startTime=2015-04-04&endTime=2015-04-04),分析url發現只要改變後面的日期就可以分別的抓取各個日期下的資料,分析完畢,找一個url開始抓取;有一個小插曲,剛開始抓取的時候,返回的頁面資訊都是404.html,最後分析發現網站對非瀏覽器的請求進行了遮蔽,直接跳轉404。後臺加綠色程式碼的部分,成功抓取資料。

function crawl($url){
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_HEADER, false);
         

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');

         curl_setopt($curl, CURLOPT_POST, 1); 
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
         $result=curl_exec($ch);
         curl_close($ch);
         return $result;
    }

3、解析資料

     檢視頁面原始碼發現,第一行為title去掉,最後兩列為平臺的連線和關注,均過濾掉。第一列的id需要根據下列的連線來擷取,中間的所有資料會有漢子的單位和一些特殊字元,使用preg_replace進行替換,最後按照網貸之家平臺的資料格式進行拼接入庫的SQL,返回done。

function  analyze($dom,$satTime){
        $html = new simple_html_dom();
        $sql= "insert into XXX_data (XXPlatId,platName,averageMonth,dayTotal,averageRate,investNumber,averageInvestMoney,averageBorrowTime,borrowNumer,borrowBidNumber,averageBorrowMoney,firstTenInvestRate,firstTenBorrowRate,bidEndTime,registerTime,registerMoney,leverageFund,invest30total,repay60total,repayTotal,statisticsTime,excuteTime) values ";                
        $html->load($dom);
        $istitle=0;
        foreach($html->find('tr') as $tr){
          $istitle=$istitle+1;
          if($istitle==1){
            continue;
          }
          $sql.="(";
          $count=0;
          foreach($tr->find('td') as $element){       
              $count=$count+1;
              if($count==1){
                $href=$element->next_sibling()->find('a', 0)->href;
                $href=strstr($href, '.', TRUE);
                $href=strstr($href,'-');            
                $sql.="'".substr($href,1)."',";
              }elseif($count==2){
                $val=$element->find('a', 0)->innertext;
                $sql.="'".$val."',";
              }elseif($count<21){
                $patterns = array();
                $patterns[0] = '/([\x80-\xff]*)/i';
                $patterns[1] = '/[%*]/';
                $val=preg_replace($patterns,'',$element->innertext);
                $sql.="'".$val."',";
              }
          }
          $sql.="'".$satTime."','".date('Y-m-d H:i:s')."'),";    
        } 
        $sql = substr($sql,0,strlen($sql)-1);
        $sql = strip_tags($sql);
        return $sql;
    }

4、入庫

         通過網上的查詢學習,發現PHP操作mysql比起java來說更簡單,幾句程式碼搞定.

 function  save($sql){
        $con = mysql_connect("192.168.0.1","root","root");
        if (!$con){
           die('Could not connect: ' . mysql_error());
        }
        mysql_select_db("xx_data", $con);
        mysql_query("set names utf8");
        mysql_query($sql);
        mysql_close($con);
    }

5、批量爬取

     通過分析資料的查詢條件,每次的查詢都是根據url字尾的日期來查詢當日交易資料,  http://XXX/indexs.html?startTime=2015-04-01&endTime=2015-04-01,因為只需要遍歷歷史日期來拼接URl就用來爬取歷史的所有交易。

function execute(){
      $starttime="2014-04-15";
      $endtime="2015-04-15";
      for($start = strtotime($starttime); $start <= strtotime($endtime);$start += 86400){
         $date=date('Y-m-d',$start);
         $url="http://shuju.XX.com/indexs.html?startTime=".$date."&endTime=".$date;
         //第一步 抓取
         $dom=crawl($url);
         //第二步  解析
         $sql=analyze($dom,$date);
         //第三步 入庫
         save($sql);
     }
      echo  "execute end";
    }
     
     execute();

6、設定定時服務

       設定定時任務來每天固定時間來抓取最新的資料,以免每次手工來執行,php也有自己的定時任務,但是網上看了下實現起來太複雜,因此利用linux的crontab來實現,linux下面輸入crontab –e 進入編輯狀態,新增一條定時利用curl來呼叫,至此爬蟲功能完畢。

    30 09 * * * curl  http://192.168.0.1/crawl.php

 

此程式僅供學習交流,如果有需要完整原始碼的朋友可以單獨聯絡我。

相關文章