近段需要寫關於爬取課表的功能,現在完成了,來總結一下,說說自己踩過的坑。希望能幫到大家。

1. 分析

首先我們要了解 Http Cookie 的作用(可參考HTTP cookies 詳解),簡單來說就是維持一個會話,這樣我們就能在登陸一個網頁后,就能進入這個網頁需要登陸的界面。

現在我們需要模擬登陸青果教務系統,就也需要先獲取服務器給我們的cookie,然后用這個cookie值去獲取驗證碼登陸,獲取我們想要的內容。要注意的是有的網站對表頭信息也是有驗證的,我們需要在請求中添加表頭信息。

總結起來就三部,首先獲取登錄界面的驗證碼並存儲Cookie,然后通過cookie來模擬登陸,最后進入教務系統取想要的東西。

現在我們需要去留意的內容,各個請求的連接、header、和發送的數據

2. 查看請求

首先我們查看首頁,我們發現登錄並不在首頁上,需要點擊用戶登錄后才算進入了登錄界面。

然后我們查看登錄界面的請求。我們就是需要圖中的Cookie 來登錄,

在看驗證碼的請求,發現其中你的Cookie是一樣的,所以,我們直接獲取驗證碼的Cookie保存就行,不管登界面。

我們在看登錄的請求,請求類型為POST,還是原來的cookie,但是我們發現傳送的數據竟然那么多,其實,比多請求幾次就會發現,其實有幾個的值是永遠不會變的,我們下面接着分析。

查看表單登錄結構,發現剛才的提交數據都是隱藏的標簽,並且都是大部分都是固定值,只有兩個是我在輸入密碼或驗證碼時會一直變動,其實這兩個就是密碼和驗證碼,只是進行了特殊處理,這個網頁引入了一個 md5.js 文件(上面第二張圖中可以看到),加密就是通過這個文件進行的。

我們尋找加密部分的代碼,在頁面的某一部分,我們發現了加密的代碼,我們在模擬登陸時就可以使用這部分處理了。

當我們登陸成功后我們課表的請求。OK,我們的心思收集工作完成了。下面開始編碼吧。

3. 獲取驗證碼和Cookie

首先我們需要一個界面來模擬登陸,我寫了一個簡單的html form登錄,需要注意的是咋提交賬號密碼時要對信息使用 md5.js 加密。

/**

*test.html文件

*/

課表登錄

學號:

密碼:

驗證碼:

登錄

我們來獲取驗證碼 ,注意的是我是吧Cookie存儲到了本地

/** */php/getValidate.php文件

*/

//Cookie存儲文件

$cookie_file = dirname(__FILE__)."/../cookie/tmp.cookie";

if(!file_exists($cookie_file)) {

$myfile = fopen($cookie_file, "w");

fclose($myfile);

}

$t = isset($_GET['t'])?$_GET['t']:0;

$verify_code_url = "http://jwgl.xxxxxx.edu.cn/jwweb/sys/ValidateCode.aspx?t=".$t;

//不用糾結那條需要不需要,直接header都寫上是不會錯的

$header = [

'Accept:image/webp,image/apng,image/*,*/*;q=0.8',

'Accept-Encoding:gzip, deflate',

'Accept-Language:zh-CN,zh;q=0.8',

'Cache-Control:no-cache',

'Connection:keep-alive',

'Host:jwgl.xxxx.edu.cn', //修改名稱

'Pragma:no-cache',

'Referer:http://jwgl.xxxxx.edu.cn/jwweb/_data/login.aspx',//修改名稱

'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36',

];

$curl = curl_init();

curl_setopt($curl,CURLOPT_HTTPHEADER,$header); //設置表頭

curl_setopt($curl, CURLOPT_URL, $verify_code_url); // 設置請求地址

curl_setopt($curl,CURLOPT_COOKIEJAR,$cookie_file); //獲取COOKIE並存儲

$img = curl_exec($curl);

curl_close($curl);

//輸出圖片到html

echo $img;

當進入test.html 時,cookie文件夾下就有存儲的Cookie了

4. 模擬登陸

然后我們模擬登錄,主要的地方是要用之前存儲的Cookie和用Post請求

//Cookie路徑

$cookie_file = dirname(__FILE__)."/../cookie/tmp.cookie";

$url = 'http://jwgl.xxxx.edu.cn/jwweb/_data/index_LOGIN.aspx';

$post = [

'__VIEWSTATE' => 'dDw4ODEwMTkyNTY7Oz6uXw9RQf0bw8SrGIjZutgOtpxLCw==',

'__VIEWSTATEGENERATOR' =>'4B596BA9',

'pcInfo' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3080.5 Safari/537.36undefined5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3080.5 Safari/537.36 SN:NULL',

'typeName' => '(unable to decode value)',

'dsdsdsdsdxcxdfgfg' => $_POST['password'],

'fgfggfdgtyuuyyuuckjg' => $_POST['validate'],

'Sel_Type' => 'STU',

'txt_asmcdefsddsd' => $_POST['txt_asmcdefsddsd'],

'txt_pewerwedsdfsdff'=> '',

'txt_sdertfgsadscxcadsads' => '',

'sbtState' => '',

];

$post = http_build_query($post);

$headers = array(

"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",

"Accept-Encoding:gzip, deflate",

"Accept-Language:zh-CN,zh;q=0.8",

"Cache-Control:max-age=0",

"Content-Length:603",

"Content-Type:application/x-www-form-urlencoded",

"Host:jwgl.xxxx.edu.cn",

"Origin:http://jwgl.xxxx.edu.cn",

"Proxy-Connection:keep-alive",

"Referer:http://jwgl.xxxx.edu.cn/jwweb/_data/index_LOGIN.aspx",

"Upgrade-Insecure-Requests:1",

"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3080.5 Safari/537.36",

);

$curl = curl_init();

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//設置header

curl_setopt($curl, CURLOPT_URL, $url); //設置url

curl_setopt($curl, CURLOPT_POST, true); // 設置為POST請求

curl_setopt($curl, CURLOPT_RETURNTRANSFER,1); // 將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。

curl_setopt($curl, CURLOPT_POSTFIELDS, $post); //傳送的數據

curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //設置cookie

$result=curl_exec($curl);

//可以輸出當前信息看看是否登錄成功

//$file = dirname(__FILE__)."/../html/test.html";

//$fp = fopen($file,"w");

//fwrite($fp,$result);

//fwrite($fp, '結束');

//fclose($fp);

5. 獲取數據

到此,我們已經登錄成功了,然后我們就可以進入系統提取數據了,比如提取課表信息。

$curl = curl_init();

$url = 'http://jwgl.xxx.edu.cn/jwweb/wsxk/stu_zxjg_rpt.aspx';

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_HEADER, false);

curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);

curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);

$result=curl_exec($curl);

$file = dirname(__FILE__)."/../html/test.html";

$fp = fopen($file,"w");

fwrite($fp,$result);

fclose($fp);

6. 提取數據

當我們得到網頁文本時,並不是我們的最終目的,我們要的是其中除了html標簽之外的數據。關於提取數據,我推薦大家使用symfony/dom-crawler,再配合他的symfony/css-selector來將html文本轉換成結點,通過CSS選擇器方式定位結點獲取相應的數據。

青果教务系统php源码,使用PHP 的 curl 爬取 青果教務系統 課表相关推荐

  1. 基于Java毕业设计校园教务系统登录源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计校园教务系统登录源码+系统+mysql+lw文档+部署软件 基于Java毕业设计校园教务系统登录源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开 ...

  2. 计算机毕业设计Java校园教务系统登录(源码+系统+mysql数据库+Lw文档)

    计算机毕业设计Java校园教务系统登录(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java校园教务系统登录(源码+系统+mysql数据库+Lw文档) 本源码技术栈: 项目架构:B/S架构 ...

  3. 【Java】源码实现]使用数据先爬取再分析如何有效投资房产

    使用Java.Excel数据分析如何有效投资房产 写在前面的话 2017年IT业中多起猝死.自杀,创业的九死一生,各大公司清算.裁员等.年底也总是充斥着各种活动刷屏,年终总结.账单等.30岁的程序猿什 ...

  4. python爬取图片源码_半次元图片爬取-python爬取半次元图片源码下载-西西软件下载...

    python爬取半次元图片源码,由大神自制的python爬取工具,本源码针对半次元图片平台,可以爬取最新的网站图片资源,支持自定义保存目录,非常方便,需要requests库的支持,想要相关源码资源的朋 ...

  5. 一对一直播源码服务器怎么样防范恶意爬取信息

    在一对一直播源码运行的过程中,产生的数据会存储在服务器上,对于任何一个平台来说,数据安全是数据存储最需要解决的问题.除了恶意访问.域名劫持等数据问题,有些爬虫会恶意爬取网站信息,这时候就需要进行进行拦 ...

  6. 源码大公开!Python爬取豆瓣电影Top250源代码,赶紧收藏!

    哈喽~大家好,我是恰恰.不知道是不是有很多小伙伴跟我一样,很喜欢看电影,尤其是那种别人推荐的豆瓣高分电影,所以学Python就有一个好处,用Python爬取豆瓣电影那是分分钟的事,再也不用因为有些电影 ...

  7. python爬虫requests源码链家_python爬虫——爬取链家房价信息(未完待续)

    爬取链家房价信息(未完待续) items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # ...

  8. python爬虫requests源码链家_python爬虫爬取链家二手房信息

    #coding=utf-8 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup imp ...

  9. 计算机毕业设计ssmAI学院教务信息管理系统lx9v9系统+程序+源码+lw+远程部署

    计算机毕业设计ssmAI学院教务信息管理系统lx9v9系统+程序+源码+lw+远程部署 计算机毕业设计ssmAI学院教务信息管理系统lx9v9系统+程序+源码+lw+远程部署 本源码技术栈: 项目架构 ...

  10. 计算机毕业设计springboot教务管理系统l7srg源码+系统+程序+lw文档+部署

    计算机毕业设计springboot教务管理系统l7srg源码+系统+程序+lw文档+部署 计算机毕业设计springboot教务管理系统l7srg源码+系统+程序+lw文档+部署 本源码技术栈: 项目 ...

最新文章

  1. Eclipse工程标准目录层次结构
  2. 查阅文献时向原作者发邮件要文献的简单模板
  3. 做音视频开发,你读对书了吗?(内有福利)
  4. 培训学习笔记 - 人们不买钻头,他们买孔洞
  5. 16位的数字高字节和低字节_显示8位数字的较低和较高半字节的掩蔽| 8086微处理器...
  6. 联合、枚举和类型别名 - C++快速入门13
  7. 阿里最新组织架构大轮岗,主要涉及HR线
  8. iOS code collection
  9. 80端口为什么要备案_成都为什么要登记icp备案需要多久
  10. linux安装网易云
  11. AUTOCAD——设置颜色
  12. 完美解决Window11任务栏合并图标的问题。
  13. 石油石化物资采购杂志石油石化物资采购杂志社石油石化物资采购编辑部2022年第16期目录
  14. 手推优化算法,了解KKT和closed-form solution是如何使用的
  15. 使用QT5书写的护眼程序
  16. python色卡_python plt 色卡
  17. 生产系统搭建spark,基础环境注意事项
  18. 试题 B: 既约分数
  19. python安装launcher要选吗_python launcher是什么
  20. 如何设置火狐主页及将火狐新建的标签页也设置成主页

热门文章

  1. 目标检测论文解读复现之十九:基于YOLOv5网络模型的人员口罩佩戴实时检测
  2. 使用vscode编写html代码
  3. 商务周刊:别了,摩托罗拉
  4. c++游戏服务器方向需要多少功底?
  5. 【TODO】Java并发:@GuardedBy
  6. 股票交易接口Java Serializable接口实现问题?
  7. android刮刮乐游戏布局,Android实现 刮刮乐效果
  8. 电脑无法获取服务器信息,电脑无法获取IP地址怎么办?原来只需四招就搞定
  9. Windows mysql secure_file_priv 设置
  10. libvirt live migration 流程