怎么解决php curl代码在本地可以运行,在服务器出错(服务器curl服务正常)?

写了一个php的网页来抓取成绩信息,用的curl模拟登录,在本地调试没有问题,放到服务器就只能在模拟登录之后输出了验证成功,但是抓取网页的时候,那个网页提示权限不足。本地偶尔会有这样的提示,但是服务器从来就没有成功过。
下面是类文件:

 class Show
{
    private $username;
    private $password;

    function __construct($username,$password)
    {
        $this->username=$username;
        $this->password=$password;
    }
    //测试用
    $username='xxxxxxx';
    $password='xxxxxxx';


    function login_post($url, $cookie, $post) {   
        $curl = curl_init($url);//初始化curl模块   
        curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址   
        curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息   
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//是否自动显示返回的信息   
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中   
        curl_setopt($curl, CURLOPT_POST, 1);//post方式提交   
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);//要提交的信息 
        // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); //跳过https验证
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); 
        curl_exec($curl);//执行cURL   
        curl_close($curl);//关闭cURL资源,并且释放系统资源   
    }   

    //登录成功后获取数据   
    function get_content($url, $cookie) {   
        $ch = curl_init($url);   
        curl_setopt($ch, CURLOPT_URL, $url);   
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $host = array("Host: yjsjw.chd.edu.cn");  
        curl_setopt($ch, CURLOPT_HTTPHEADER,$host);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie   
        $rs = curl_exec($ch); //执行cURL抓取页面内容   
        curl_close($ch);   
        return $rs;   
    } 

    function get_info(){
        $post = "IDToken0=&IDToken1={$this->username}&IDToken2={$this->password}&IDButton=登录&goto=aHR0cDovL3lqc2p3LmNoZC5lZHUuY24vc3NvL2NoZC9jYWxvZ2luLmpzcA==&encoded=true&gx_charset=UTF-8";
        //登录地址   
        $url = "http://ids1.chd.edu.cn:82/amserver/UI/Login";   
        //设置cookie保存路径   
        $cookie = dirname(__FILE__) . '/cookie_oschina.txt';   
        //登录后要获取信息的地址   
        $url2 = "http://yjsjw.chd.edu.cn/studentscore/queryScore.do";   
        //模拟登录   
        login_post($url, $cookie, $post);   
        //获取登录页的信息   
        $content = get_content($url2, $cookie);  
        //echo $content; 
        //删除cookie文件   
        @ unlink($cookie);   
        //匹配页面信息   
        preg_match_all('#<td>(.+?)</td>#',$content,$tr1);
        //输出内容
        var_dump($tr1);   
    }

这就是出错的信息

正常抓取,没有匹配页面信息的时候,应该是这样的

问题更新

昨天改了一下,发现面向对象的时候,这个程序在本地和服务器都不能抓取。

<?php  
    require_once "show.php";
    $us=$_POST['username'];
    $pa=$_POST['password'];

    $show=new Show($us,$pa);
    $show->get();
 ?>
 
 
 <?php 

   class Show
   {
       public $us;
       public $pa;
       public $post;
    //登录地址   
    public $url = "http://ids1.chd.edu.cn:82/amserver/UI/Login";   
    //设置cookie保存路径   
    public $cookie = '/cookie.txt';//dirname(__FILE__) .
    
    //登录后要获取信息的地址  
    
    public $url2 = "http://yjsjw.chd.edu.cn/studentscore/queryScore.do";   
       
       function __construct($us,$pa)
       {
           $this->us=$us;
           $this->pa=$pa;
           $post = "IDToken0=&IDToken1=".$us."&IDToken2=".$pa."&IDButton=登录&goto=aHR0cDovL3lqc2p3LmNoZC5lZHUuY24vc3NvL2NoZC9jYWxvZ2luLmpzcA==&encoded=true&gx_charset=UTF-8"; 
       }
       function qx(){
        chmod($this->cookie,777);  
       }

       function login_post($url, $cookie, $post) {   
    $curl = curl_init($url);//初始化curl模块   
    curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址   
    curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息   
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//是否自动显示返回的信息   
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中   
    curl_setopt($curl, CURLOPT_POST, 1);//post方式提交   
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post);//要提交的信息 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //跳过https验证
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); 
    curl_exec($curl);//执行cURL 
    self::qx();
    curl_close($curl);//关闭cURL资源,并且释放系统资源   
    }   

    //登录成功后获取数据   
    function get_content($url, $cookie) {   
        $ch = curl_init($url);   
        curl_setopt($ch, CURLOPT_URL, $url);   
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $host = array("Host: yjsjw.chd.edu.cn");  
        curl_setopt($ch, CURLOPT_HTTPHEADER,$host);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie   
        $rs = curl_exec($ch); //执行cURL抓取页面内容   
        curl_close($ch);   
        return $rs;   
    } 
    
    function get(){
        //模拟登录   
        $this->login_post($this->url, $this->cookie, $this->post);   
        //获取登录页的信息   
        $content = $this->get_content($this->url2, $this->cookie);   
        //删除cookie文件   
        @ unlink($this->cookie);   
        //匹配页面信息   
        // $preg = "/<td class='portrait'>(.*)<\/td>/i";   
        // preg_match_all($preg, $content, $arr);   
        // $str = $arr[1][0];   
        //输出内容   
        echo $content;
    }
    
       }   

 ?>
阅读 5.7k
3 个回答

你把请求来源打开试试

新手上路,请多包涵

$cookie = dirname(__FILE__) . '/cookie_oschina.txt';
看一下你的这个文件是否存在

大致看了一下,没有具体错误日志无法准确确定,猜测是因为执行php程序的用户没有cookie_oschina.txt这个文件的读取权限。对这个文件执行一下chmod +r 路径/cookie_oschina.txt试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题