PHP多线程抓取一万两千家股票交易信息

老bia同学 · · 152 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
 public function curl_http($code_list,$timeout){
        $res = array();
        $mh = curl_multi_init();//创建多个curl语柄
        foreach($code_list as $k=>$v){

            $post_data=[
                "page"=>"0",
                "zqzm"=>$v,
            ];
            $conn[$k]=curl_init();
            curl_setopt($conn[$k], CURLOPT_URL, 'http://www.neeq.com.cn/nqxyxxController/nqxygkxxPage.do');//url
            curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);
            curl_setopt($conn[$k], CURLOPT_POST, true);//传递类型post
            if($post_data!==''){
                curl_setopt($conn[$k], CURLOPT_POSTFIELDS,$post_data);//设置传递的参数
            }

            curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间
            curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别
            curl_setopt($conn[$k], CURLOPT_HEADER, 0);//这里不要header,加块效率
            curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect

            curl_multi_add_handle ($mh,$conn[$k]);
        }

        // 执行批处理句柄
        $active = null;
        do{
            $mrc = curl_multi_exec($mh,$active);//当无数据,active=true
        }while($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时
        while($active && $mrc == CURLM_OK){//当无数据时或请求暂停时,active=true
//        if(curl_multi_select($mh) != -1){
            do{
                $mrc = curl_multi_exec($mh, $active);
            }while($mrc == CURLM_CALL_MULTI_PERFORM);
//        }
        }

        foreach ($code_list as $k => $url) {
            curl_error($conn[$k]);
            $res[$k]=curl_multi_getcontent($conn[$k]);//获得返回信息
            $header[$k]=curl_getinfo($conn[$k]);//返回头信息
            curl_close($conn[$k]);//关闭语柄
            curl_multi_remove_handle($mh  , $conn[$k]);//释放资源
        }

        curl_multi_close($mh);
        return $res;

    }

 

 public function index1(){
        header("Content-type: text/html; charset=utf-8");
        set_time_limit(0);//设置永不超时

        $all_code_list=[
            400002,
            400005,
            400006,
            400007,
            400008,
            400009,
            400010,
            400011,
            400012,
            400013,
            400016,//........总共一万两千家
       
        ];//12000家新三板股票代码
        //由于接口方短时间只能处理400左右的数据来源,所以,sleep30秒后再进行抓取
        $i=0;$num=100;$count_i=count($all_code_list)/$num;
        $res_all=array();
        for($i=0;$i<$count_i;$i++){
           $now=$i*$num;
           $now_code_list=array_slice($all_code_list,$now,$num);
           $res=$this->curl_http($now_code_list,'10');
           //处理数据集
            foreach($res as $k=>$v){
                if(strlen($v)>155){
                    $data=ltrim($v,'null([');  $data=rtrim($data,"])");
                    $data=json_decode($data,true);
                    foreach ($data["content"] as $k1=>$v1){
                        $add["stock_code"]=$v1["HQZQDM"]; $add["name"]=$v1["HQZQJC"];
                        $add["price"]=$v1["HQCJJG"]; $add["number"]=$v1["HQCJSL"];
                        $add["jine"]=$v1["HQCJJE"];  $add["buy"]=$v1["HQBJYDY"];
                        $add["sale"]=$v1["HQSJYDY"];  $add["time"]=$v1["HQJSRQ"];
                        $add["add_time"]=time();
                        $res=Db::name("sale_info")->insertGetId($add);
                        echo("<p>".$res."</p>"); //2805
                    }
                }
            }
        }
        sleep(10);

        /*$i=0;
        foreach($res as $k=>$v){
            if(strlen($v)>145){
             $i++;
            }
        }
        echo($i."<br/>");*/
    }

 

本文来自:开源中国博客

感谢作者:老bia同学

查看原文:PHP多线程抓取一万两千家股票交易信息

152 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet