• 抓取网站内容常见方法


    <?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</li>//获取分页的信息
            $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  = '/<dd[^>]*>([\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;
        }
  • 相关阅读:
    python
    Yii框架的学习指南(策码秀才篇)1-1 如何认识Yii framework
    yii执行流程简单介绍
    html5页面编码如何确定
    防止表单重复提交的几种策略
    2维数组排序
    YII框架开发一个项目的通用目录结构:
    phpcms添加图片投票
    windows下面apache配置虚拟目录(测试使用,发布网站不建议目录访问)
    js获取浏览器的版本代码
  • 原文地址:https://www.cnblogs.com/helin/p/2610801.html
Copyright © 2020-2023  润新知