这两天有基友要php中curl抓取教务处成绩的源码,用于微信公众平台的开发。下面笔者只好忍痛割爱了。php中CURL技术模拟登陆抓取数据实战,抓取沈阳工学院教务处学生成绩。

首先,教务处登录需要验证码。我们寻找验证码的链接地址http://218.61.108.163/ACTIONVALIDATERANDOMPICTURE.APPPROCESS,来进行数据的抓取。下面看下主要代码-index.php

<?php
$ch=curl_init("http://218.61.108.163/ACTIONVALIDATERANDOMPICTURE.APPPROCESS");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,1);
$str=curl_exec($ch);
curl_close($ch);
list($header, $body) = explode("\r\n\r\n", $str);
preg_match("/JSESSIONID=(.*); path=/i", $header, $matches);
$cookie = $matches[1]; ?>

需要模拟cookie进行登录,所以我们建立一个api.php的页面进行cookie的模拟,以及需要抓取成绩的链接地址http://218.61.108.163/ACTIONLOGON.APPPROCESS,对首页index.php表单中值进行获取

<?php
if(isset($_POST['code'])){
$jwid=$_POST['xuehao'];
$jwpwd=$_POST['mima'];
$code=$_POST['code'];
$ck=$_POST['ck'];
$data="WebUserNO={$jwid}&Password={$jwpwd}&Agnomen={$code}&submit.x=23&submit.y=9&applicant=ACTIONQUERYSTUDENTSCORE";
$ch=curl_init("http://218.61.108.163/ACTIONLOGON.APPPROCESS");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIE, "JSESSIONID={$ck}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$str=curl_exec($ch);
curl_close($ch);
}
}

在登录页中,我们可以看到登录需要验证码。所以,我们建议一个code.php页面用于验证码的获取、

<?php
$ch=curl_init("http://218.61.108.163/ACTIONVALIDATERANDOMPICTURE.APPPROCESS");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIE, "JSESSIONID={$_GET['ck']}");
$str=curl_exec($ch);
curl_close($ch);
echo $str;
?>

最后一步。把所要获取的数据接收,使用正则表达式进行数据的抓取以及排版。

<?php
function get_td_array($table) {
$table = preg_replace("/<table[^>]*?>/is","",$table);
$table = preg_replace("/<tr[^>]*?>/si","",$table);
$table = preg_replace("/<td[^>]*?>/si","",$table);
$table = str_replace("</tr>","{tr}",$table);
$table = str_replace("</td>","{td}",$table);
$table = str_replace("&nbsp;","",$table);
$table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);
$table = preg_replace("'([rn])[s]+'","",$table);
$table = str_replace(" ","",$table);
$table = str_replace(" ","",$table); $table = explode('{tr}', $table);
array_pop($table);
foreach ($table as $key=>$tr) {
$td = explode('{td}', $tr);
$td = explode('{td}', $tr);
array_pop($td);
$td_array[] = $td;
}
return $td_array;
}
?>

完整的代码大家可以去http://pan.baidu.com/share/link?shareid=3722188112&uk=1496266064进行下载。密码:a3eh

php中CURL技术模拟登陆抓取数据实战,抓取某校教务处学生成绩。的更多相关文章

  1. PHP中CURL技术模拟登陆抓取网站信息,用与微信公众平台成绩查询

    伴随微信的红火,微信公众平台成为许多开发者的下一个目标.笔者本身对于这种新鲜事物没有如此多的吸引力.但是最近有朋友帮忙开发微信公众平台中一个成绩查询的功能.于是便在空余时间研究了一番. 主要的实现步骤 ...

  2. php中CURL实现模拟登录并采集数据

    在php中采集我们用的是简单的采集方式(例如file_get_contents)就无法做到了,但是如果想模拟登录用户并采集利用它就没办法了,我们可利用CURL函数来实现模拟登录并采集数据 这里要说一些 ...

  3. 跟着百度学PHP[17]-PHP扩展CURL的模拟登陆并获取数据

    这两天也不知道怎么,学习效率低.很无奈. 如何知道要去URL该怎么填写呢?就是填写表单中的Action内容: tempnam() 函数创建一个具有唯一文件名的临时文件. <?php header ...

  4. PHP 之 CURL 模拟登陆并获取数据

    1.CURL模拟登陆的流程和步骤 2.tempnam 创建一个临时文件 3.使用CURL模拟登陆到PHP100论坛 <?php $cookie_file = tempnam('./temp',' ...

  5. 【转】PHP 之 CURL 模拟登陆并获取数据

    1.CURL模拟登陆的流程和步骤2.tempnam 创建一个临时文件3.使用CURL模拟登陆到PHP100论坛 <?php$cookie_file = tempnam('./temp','coo ...

  6. 【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

    实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart  难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install ...

  7. 直接通过curl方式取得数据、模拟登陆、POST数据

    博客园的Markdown编辑器太坑爹了@!!! 算了.不用格式了!!! /********************** curl 系列 ***********************/ //直接通过c ...

  8. python3 selenium模拟登陆斗鱼提取数据保存数据库

    # coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...

  9. 使用google chrome抓取数据:抓取全国的高中的数据

    http://tomycat.github.io/blog/other/2014/05/28/use-google-chrome-capture-data.html

随机推荐

  1. iOS从生成证书到打包上架-02(详细2016-10最新)

    由于篇幅的限制,这篇接着上一篇(关于证书)写的,有需要的小伙伴可以先阅读上一篇 2.在App Store创建应用 1.回到Account,点击iTunes Connect 2.点击我的App 3.点击 ...

  2. javascript-智能社-笔记

    JavaScript是什么 JavaScript就是修改样式 编写JS的流程 布局:HTML+CSS 属性:确定要修改哪些属性 事件:确定用户做哪些操作(产品设计) 编写JS:在事件中,用JS来修改页 ...

  3. HTTPResponse.read([amt]):只能read一次

    业务需要:我要写个tanx模拟器,给DSP发竞价请求. 下面是部分代码: def PostDataToDSP(self,url,postdata): headers = { 'Content-Type ...

  4. [Webpack 2] Add Code Coverage to tests in a Webpack project

    How much of your code runs during unit testing is an extremely valuable metric to track. Utilizing c ...

  5. cglib源码分析(四):cglib 动态代理原理分析

    本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...

  6. c结构体初始化问题

    结构体中的数组的初始化问题 我的代码 C/C++ code #include <stdio.h> #include <stdlib.h> struct a { int leng ...

  7. android 开发过程中碰到的 Failed to create the part's controls 问题

    在开发android的过程中,遇到一个很奇怪的问题,出现了“ Failed to create the part's controls” 的错误,查询了N多资料,然后逐条删除代码测试, 后来发现是变量 ...

  8. Nginx高性能服务器安装、配置、运维 (1) —— Nginx简介

    一.Nginx 简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器. Nginx特点 ...

  9. Java并发——使用Condition线程间通信

    线程间通信 线程之间除了同步互斥,还要考虑通信.在Java5之前我们的通信方式为:wait 和 notify.Condition的优势是支持多路等待,即可以定义多个Condition,每个condit ...

  10. 隐藏/显示&nbsp;我的电脑盘符驱动…

    组策略里更改即可:点击"开始"→"运行",输入"gpedit.msc",打开组策略.在窗口左侧的"本地计算机策略"中依次 ...