1. 程式人生 > >炒基金輸了,抓點資料出來。。。。

炒基金輸了,抓點資料出來。。。。

哎~~ 不想拿點死工資,跑去買基金,結果一直虧損,工作之餘準備抓點資料研究一下,結果某某平臺提供介面居然還有收錢,無奈~只有跑到別人網站去找請求…….
(有興趣的朋友留下email一起設計一個適合自己的投資基金演算法呢?
目前正在寫一個自己用的幫助系統,感興趣的小夥伴call我哦http://www.zhengyang0818.cn
由於是在windows下面寫的,抓取多個內容就沒有用php的子程序,用的curl_multi,速度還可以,將就用吧。。。。

<?php
/**
 * 基金資料捕獲.
 * User: zyy
 * Date: 2017/12/22
 * Time: 16:13
 */
//基金分類 [全部,指數型,股票型,混合型] $urlOrderBy = ['all'=>'all','zs'=>'zs', 'gp'=>'gp','hh'=>'hh']; //漲幅時間段 [周漲幅,月漲幅,三月漲幅,六月漲幅,年漲幅,三年漲幅] $urlZf = ['zzf'=>'zzf','1yzf'=>'1yzf','3yzf'=>'3yzf','6yzf'=>'6yzf','1nzf'=>'1nzf','3nzf'=>'3nzf']; /** 獲取基金資料URL * @param string $order [排序型別,參考變數 $urlOrderBy] * @param
string $zf [漲幅型別,參考變數 $urlZf] * @param int $zfPaiMing [漲幅排名所需數目,僅當設定了漲幅型別引數時有限,如果不是設定周漲幅會使$needNum失效] * @param int $needNum [所需條目] * @return string */
function buildJiJinUrl($order,$zf,$zfPaiMing,$needNum=4000){ $url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft='; //分類拼接
$url.=$order.'&rs=&gs=0&sc='; //漲幅排序拼接 if($zf){ $url.=$zf.','.$zfPaiMing; }else{ $url.='zzf'; } $today = date('Y-m-d'); $lastYear = date('Y-m-d',strtotime('-1 year')); $url.="&st=desc&sd=$today&ed=$lastYear&qdii=|&tabSubtype=,,,,,&pi=1&pn=$needNum&dx=1&v=0.5339311461808629"; return $url; } /** curl請求 單獨請求 * @param $url * @param string $method * @param array $requestData * @return mixed */ function curlRequest($url,$method='get',$requestData=[]) { try{ $curlHandle = curl_init(); curl_setopt($curlHandle,CURLOPT_URL,$url); curl_setopt($curlHandle,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($curlHandle,CURLOPT_RETURNTRANSFER,true); if($method=='post'){ curl_setopt($curlHandle, CURLOPT_POST, true); curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $requestData); } $response = curl_exec($curlHandle); curl_close($curlHandle); return $response; }catch (\Exception $e){ exit('請求失敗:'.$e->getMessage()); } } /** curl請求 批量請求 * @param array $url * @param array $method * @param array $requestData * @return array */ function curlRequests(array $url, array $method,array $requestData) { try{ //組裝curl $allCurlHandle = []; $curlNum=0; foreach ($url as $key=>$value){ $allCurlHandle[$key] = curl_init(); curl_setopt($allCurlHandle[$key] ,CURLOPT_URL,$value); curl_setopt($allCurlHandle[$key] ,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($allCurlHandle[$key] ,CURLOPT_RETURNTRANSFER,true); if($method[$curlNum]=='post'){ curl_setopt($allCurlHandle[$key] , CURLOPT_POST, true); curl_setopt($allCurlHandle[$key] , CURLOPT_POSTFIELDS, $requestData[$curlNum]); } $curlNum++; } // 建立批處理cURL控制代碼 $mh = curl_multi_init(); // 增加控制代碼 foreach ($allCurlHandle as $value){ curl_multi_add_handle($mh,$value); } $response = []; do {// 輪詢 while (($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM){ if ($execrun != CURLM_OK) { return $response; } } while ($done = curl_multi_info_read($mh)) { // 一旦有一個請求完成,找出來,處理,因為curl底層是select,所以最大受限於1024 // $response[] = curl_getinfo( $done['handle'] ); //從請求中獲取資訊 $response[] = curl_multi_getcontent($done['handle']); curl_multi_remove_handle($mh, $done['handle']); // 把請求已經完成了得 curl handle 刪除 } if ($running) {// 當沒有資料的時候進行堵塞,把 CPU 使用權交出來,避免上面 do 死迴圈空跑資料導致 CPU 100% $rel = curl_multi_select($mh, 1); if($rel == -1){ usleep(1000); } } if( $running == false){ return $response; } } while (true); return $response; }catch (\Exception $e){ exit('請求失敗:'.$e->getMessage()); } } //例如此URL將返回本週漲幅排名前10 //var_dump(curlRequest(buildJiJinUrl($urlOrderBy['all'],$urlZf['zzf'],10,10))); $url1 = buildJiJinUrl($urlOrderBy['zs'],$urlZf['zzf'],1,1); $url2 = buildJiJinUrl($urlOrderBy['gp'],$urlZf['zzf'],1,1); $url3 = buildJiJinUrl($urlOrderBy['hh'],$urlZf['zzf'],1,1); $url4 = buildJiJinUrl($urlOrderBy['zs'],$urlZf['zzf'],3,3); $urls = [$url1,$url2,$url3,$url4]; $methods =['get','get','get','get']; $info = curlRequests($urls,$methods,array()); //一次抓取多個數據 var_dump($info);