[導讀] 因為本人公司正處於P2P的行業,分析行業資料,對平臺的運營決策有著很大的作用,因此需要爬網貸之家的相關資料。
1、分析
通過右鍵檢視頁面原始碼發現頁面結構為表格佈局,因此設想可以分為四個步驟來採集資料:
1、使用爬蟲將頁面抓取下來;
2、對頁面資料進行解析;
3、入庫(mysql);
4、寫個定時服務每天定時抓取。
因為公司網站使用PHP,最近也學習了一點,curl非常適合用來爬去網頁,決定用PHP程式進行抓取。
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
此程式僅供學習交流,如果有需要完整原始碼的朋友可以單獨聯絡我。