抓取网站内容常见方法

php
/*------------------------
根据给出地址,获取网页及页面内的js,css文件按原文件名保存到本地
-------------------------*/
       $url  = 'http://www.zzzzz.com/html_13.html';//页面路径
        $dir = APP_PATH.'save-xiaohaopin/';//保存数据的文件夹路径,因框架不同而定APP_PATH
        //路径不存在则创建
        if(!is_dir($dir)){
            mkdir($dir);
        }
        
        $ch = curl_init(); 
        curl_setopt ($ch, CURLOPT_URL, $url); 
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10); 
        $html = curl_exec($ch);
        //html保存
        $hpath  = @fopen($dir.'html_13.html','wb');
        fwrite($hpath,$html);
        fclose($hpath);
        //正则表达式
        $pre = '/"([^"]*\.(js|css)[^"]*)"/i';//js&css
        $urlarr = array();
        preg_match_all($pre,$html,$urlarr);
        $urlarr = $urlarr[1];
        //url处理&&根据url获取结果不同而自定义处理
        //./templates/js/gongjutiao.js&&&&&./templates/css/gongjutiao.css
        $mainurl = 'http://www.zzzzz.com/';
        //just save it
        foreach($urlarr as $k => $u){
            $surl = str_replace('./','',$u);
            $dourl = $mainurl.$surl;
            $fileName = substr($u,strrpos($u,'/')+1);
            $savePath = $dir.$fileName;
            $con = file_get_contents($dourl);
            $fop = @fopen($savePath,'wb');
            fwrite($fop,$con);
            fclose($fop);    
        }        
        exit('Obtain all');

/*----------------end
---------------------*/

/*------------------------
获取某个网站过多数据或者抓取过快等因素,都会经常导致IP被封的风险,但我们可以自己利用PHP构造IP地址的方式,获取数据。
-------------------------*/

       $headers['CLIENT-IP'] = $headers['X-FORWARDED-FOR'] = '127.0.0.1'; //些处只是个例,IP可以自己定义
        $headerArr = array();
        foreach( $headers as $n => $m ) {
            $headerArr[] = $n .':' . $m;
        }
        //$refer = $_SERVER["HTTP_REFERER"];
        
        
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
        curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr); //构造IP
        $html = curl_exec($ch);
        curl_close($ch);
        
        //下面就可以写自己抓取数据的正则表达式
        $reg = '/.*/';
        
        
        //正则匹配后放到相应的数组里面
        $arr= array();
        preg_match($reg,$html,$arr);

        //可以做数据处理,例:
        $val = $arr[1];
        
        //数据组装
        $data = array(
            'val'     =>$val,
        );    
        //var_dump($data);exit;
        //数据添加到数据库,下面是ThinkPHP框架用法
        M('WeaponAttr')->add($data);
        //如果有封IP风险,可以调节抓取的速度或者做一些其它的优化
        sleep(5);
        echo 'ok';exit;
/*----------------end
---------------------*/


/*------------------------
在获取某网站的数据的过程中,往往网页会通过网页点击传送js参数,利用ajax去获取数据,形成无刷新页面,在翻页的过程当中有些网站在第一次获取回来的信息之后,就在当前页面保存一个cookie,然后分页面就可以根据cookie的值去获取下一页,而且用同一种分页方式表现:例如:show_1.html,第二页就是show_2.html以此类推,。不管你访问的是哪一个分类,或者其它的一些栏目。它们获取回来的列表分页页面都是以这种形式去表现的,如果删除了cookie页面就会变为空。没有数据。
-------------------------*/
    function getdata(){        
        define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) );
        $url = 'http://';
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10); 
        curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR);//连接结束后保存cookie信息的文件。 
        $html = curl_exec($ch);
        curl_close($ch);
                
        //$html是第一次传参数的时候获取回来的数据,用get函数来对获取回来的数据处理        
        $this->get($html);
        
        //class="page">4//获取分页的信息
        $parr = array();
        $page = '/class="page">(\d+)';
        preg_match_all($page,$html,$parr);
        
        if(!empty($parr[1])){
            $cnum = array_pop($parr[1]);
            for($i = 2;$i <= $cnum;$i++){
                $n = $this->jdoit($i);//根据coodie去获取下一页的内容回来
                $this->get($n);//内容处理
            }
        }
        
        echo 'okk';
    }
    
    
    function jdoit($num){
        $url = 'http://www.xxxx.com/fenye-'.$num.'.html';
        $ch = curl_init(); 
        curl_setopt ($ch, CURLOPT_URL, $url); 
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10); 
        curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
        //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。 
        curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
        $html = curl_exec($ch);
        curl_close($ch);
        return $html;
    }
    function get($html){
        
        //正则表达式
        $reg  = '/]*>([\s\S]*?)<\/dd>/';

        /*获取回来的内容可以在此处理*/
    
    }

/*----------------end
---------------------*/


/*------------------------
根据地址,把图片保存到本地
-------------------------*/
        $pic_url = 'http://www.picture.com/';
        $path = 'D:\picdir';//保存路径    
        if(!is_dir($path)){
            mkdir($path,0777);
        }
        $filename = $path.'name';
        ob_start(); 
        readfile($pic_url);
        $img = ob_get_contents();
        ob_end_clean();
        //$size = strlen($img);
        $fp2=@fopen($filename, "a");
        fwrite($fp2,$img);
        fclose($fp2);
/*----------------end
---------------------*/      
?>

 

/*===========================*/
    //$proxy_host->代理服务器地址,,$proxy_port->端口
    //通过代理获取网页内容
    function proxy_get_content($proxy_host,$proxy_port,$proxy_user,$proxy_password,$url){
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_PROXY,"$proxy_host:$proxy_port"); 
        curl_setopt($ch, CURLOPT_PROXYUSERPWD, "$proxy_user:$proxy_password");
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
        curl_setopt($ch, CURLOPT_HEADER,0); 
        $bcon = curl_exec($ch); 
        echo curl_error($ch); 
        curl_close($ch); 
        return $bcon;
    }

 

转载于:https://www.cnblogs.com/helin/archive/2012/07/26/2610801.html

你可能感兴趣的:(php,数据库,人工智能)