写了一个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('#(.+?) #',$content,$tr1); //输出内容 var_dump($tr1); }
昨天改了一下,发现面向对象的时候,这个程序在本地和服务器都不能抓取。
get(); ?> 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>/i"; // preg_match_all($preg, $content, $arr); // $str = $arr[1][0]; //输出内容 echo $content; } } ?>
你把请求来源打开试试
$cookie = dirname(__FILE__) . '/cookie_oschina.txt';
看一下你的这个文件是否存在
大致看了一下,没有具体错误日志无法准确确定,猜测是因为执行php程序的用户没有
cookie_oschina.txt
这个文件的读取权限。对这个文件执行一下chmod +r 路径/cookie_oschina.txt
试试