您好,欢迎光临赵帅的博客,如果有什么不足或者错误之处,感谢您留言指出!

【原创】山东大学 课程小格(php curl)

php 赵 帅 549浏览 0评论

最近刚刚忙完比赛,也算是对自己的一个锻炼,没事突然想复习一下php的爬虫,然后就写了一个小的山东大学的课程格子。

话不多说,开始动工。首先去看了一下php的curl函数。

cURL可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,

FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些:

HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,

下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至它还支持IPv6,scoket5代理服务器,通过http代理服务器上传文

件到FTP服务器等等。

这就是我们为什么要使用cURL的原因!

使用cURL完成简单的请求主要分为以下四步:

  • 初始化,创建一个新cURL资源
  • 设置URL和相应的选项
  • 抓取URL并把它传递给浏览器
  • 关闭cURL资源,并且释放系统资源

前期准备:

来我们先上图,我们首先要知道该去哪里爬东西对不对 :

qq%e5%9b%be%e7%89%8720161025143452

哈哈哈,就是上面这个东西,当然我们需要打开 chrome 浏览器的控制台(F12),然后我们需要故意输错一次密码,因为要不然就直接跳转页面了,我们也就看不到请求的 headers 了,那么点击登录之后,在控制台的 network 选项里面,可以看到这个 ajaxLogin  请求头,是下面这个:

qq%e5%9b%be%e7%89%8720161025143602

开始分析:

那么,我们对上面的这个东西进行一下分析:

 Request URl : 我们需要请求的路径 
 Request Method : 数据传输的方式
 Referer : 请求源 (可以被伪造)
 
 Form Data :我们需要传递的数据
           j_username : 学号
           j_password : 密码

核心代码:

博主把该项目放在了阿里云上面,Linux的系统,个人习惯,喜欢将一些常量定义在 config.php 文件里面

 <?php
 /*定义 根目录*/
 define('ROOT','/var/www/html/ClassBox/logs/');
 /*定义 请求的url*/
 define('BASEURL', 'http://202.194.15.33:21043');
?>

另外我们看一下登录的主要代码 login.php

$log = curl_init();
curl_setopt($log,CURLOPT_URL,$log_url);//设置 请求 url
curl_setopt($log,CURLOPT_REFERER,"http://202.194.15.33:21043");//设置 请求头
curl_setopt($log,CURLOPT_POST, true);//设置 请求方法
curl_setopt($log,CURLOPT_HEADER,0);//设置 是否保存 头文件
curl_setopt($log,CURLOPT_RETURNTRANSFER,true);
curl_setopt($log,CURLOPT_POSTFIELDS,$data);//设置 post 请求的参数
curl_setopt ($log, CURLOPT_COOKIEJAR , $log_path); // 存放Cookie信息的文件名称
curl_setopt ($log, CURLOPT_TIMEOUT, 30 ); // 设置超时限制防止死循环
curl_setopt ($log, CURLOPT_HEADER, 0 ); // 显示返回的Header区域内容
$return = curl_exec($log);
curl_close($log);

加下来是 main.php  在这个里面 同样是要 声明一个 curl的空间,需要(读取)用到 login.php  保存的cookie  

(其中保存和cookie时候,后面的那个文件的路径是一个绝对路径~~~)

<?php
 /*
 * 获取 课程表
 */
 include_once('config.php');
 $main_url = BASEURL."/f/xk/xs/bxqkb";
 $log_path = ROOT."/".$_COOKIE['user'].".txt";
 $main = curl_init();
 curl_setopt($main,CURLOPT_URL,$main_url);
 curl_setopt($main,CURLOPT_REFERER,"http://202.194.15.33:21043");
 curl_setopt($main,CURLOPT_POST, true);
 curl_setopt($main,CURLOPT_HEADER,0);
 curl_setopt($main,CURLOPT_RETURNTRANSFER,true);
 /*读取 cookie*/
 if(file_exists($log_path)){
 curl_setopt ($main, CURLOPT_COOKIEFILE, $log_path); // 读取上面所储存的Cookie信息 
 }else{
 echo -1;
 exit;
 }
 curl_setopt ($main, CURLOPT_TIMEOUT, 30 ); // 设置超时限制防止死循环 
 curl_setopt ($main, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 
 $return = curl_exec($main);
 curl_close($main);
 //在这里我们将返回的一些没有用的html标签替换掉
 $str=preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$return);//过滤style标签
 $str=preg_replace("/<(link.*?)>(.*?)<(\/.*?)>/si","",$str);//过滤link标签
 $str=preg_replace("/<(a.*?)>(.*?)<(\/a.*?)>/si","",$str);//过滤a标签
 $str=preg_replace("/<(li.*?)>(.*?)<(\/li.*?)>/si","",$str);//过滤li标签
 
 /*做一下 最后的替换*/
 $str=preg_replace("/row-fluid/","row-fluid-last",$str,2);//过滤a标签
 $str=preg_replace("/row-fluid-last/","row-fluid",$str,1);//过滤a标签
 print_r($str); 
?>

哈哈哈 到这里 应该就差不多了~~~

效果展示:

qq%e5%9b%be%e7%89%8720161025150832

欢迎访问  http://class.zhaoshuai.me/  山东大学 课程小格

(课程小格 支持密码记住功能,登录一次以后只要打开就能自动获取账号密码,直接登录即可)

转载请注明:碎念 » 【原创】山东大学 课程小格(php curl)

喜欢 (14)or分享 (0)