[導讀] 因為本人公司正處於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
此程序僅供學習交流,如果有需要完整源碼的朋友可以單獨聯系我。

