[python爬虫]爬取学校教务处成绩
学校教务处网站
登陆窗口

表单数据

观察登陆窗口和提交的表单数据可知只要将账号、密码、验证码正确赋值提交即可模拟登陆。
账号和密码都有,问题的关键就在验证码上。
右键验证码图片审查观察源码如下图:

刚开始很纠结random那段随机数,以为是确定的随机数对应确定的验证码,可是一直没有解决获取这个随机数的方法(直接抓取的话src总为空),然后去网上各种查发现这句话
一般验证码只是判断cookie 后面的随机值是为了防止浏览器读取图片缓存,造成验证码输入错误
然后自己就复制了一个带random的验证码网址刷新了两下结果发现验证码真的会变,不是根据random,于是从网上查找得知只输入random参数前的地址即可,于是继续向下开展。
具体的思路是登陆将验证码下载下来,然后手动输入,提交账号、密码、验证码三个数据进行模拟登陆。
模拟登陆
# coding:utf8 import re
import urllib
import urllib2
import cookielib loginUrl = 'http://115.24.160.162/loginAction.do' #cookie
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
#postdata
values = {
'zjh':'xxxxxx',
'mm':'xxxxxx',
'v_yzm':''
}
postdata = urllib.urlencode(values)
#headers
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Referer':'http://115.24.160.162/loginAction.do'
} #第一次请求网页得到cookie
request = urllib2.Request(loginUrl,postdata,headers=header)
response = opener.open(request)
print '第一次请求网页得到cookie:'
print response.getcode() #获取验证码----------------!!!问题一直出在这,要用带cookie的方法访问验证码的网页---这样的话进入的验证码的页面对应的验证码就是登陆页面的验证码了哈哈哈哈哈(之前用的是不带cookie的urlopen()方法...)
yzm = opener.open('http://115.24.160.162/validateCodeAction.do')
yzm_data = yzm.read()
yzm_pic = file('yzm.jpg','wb')
yzm_pic.write(yzm_data)
yzm_pic.close() #用户输入验证码
print '请输入验证码:'
values['v_yzm'] = raw_input()
#带验证码模拟登陆
postdata = urllib.urlencode(values)
request = urllib2.Request(loginUrl,postdata,header)
response = opener.open(request)
print 'Response of loginAction.do'
print response.read().decode('gbk')
爬取成绩
根据最后打印出的网址源代码可知成功登陆。现在我们来爬取成绩。
成绩页面:

刚开始以为相应的按钮会有对应的超链接,比如有一个专门的成绩网址,然后就去源代码里苦苦寻找,半天无获,而且点击不同按钮浏览器显示的连接根本不变。后来F12看了看网络那一栏发现了玄机

再看这个链接的响应正文,完美获得成绩页面。

接下来就是正则表达式匹配得到课程名称和成绩了
#bingo
top_url = 'http://115.24.160.162/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2016-2017学年秋(两学期)'
response = opener.open(top_url)
print 'Response of top.jsp'
content = response.read().decode('gbk') pattern = re.compile('<tr.*?class="odd".*?</td>.*?</td>.*?<td align="center">(.*?)</td>.*?<p align="center">(.*?) </P>', re.S)
grades = re.findall(pattern, content)
for grade in grades:
print grade[0], grade[1]
正则表达式的说明(引用自http://cuiqingcai.com/990.html)
1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。
2)(.*?)代表一个分组,在这个正则表达式中我们匹配了两个分组,在后面的遍历grades中,grade[0]就代表第一个(.*?)所指代的内容,grade[1]就代表第二个(.*?)所指代的内容,以此类推。
3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。
抓取结果

结语
感谢攀哥(他的csdn:http://m.blog.csdn.net/blog/index?username=E80FA)
[python爬虫]爬取学校教务处成绩的更多相关文章
- 用Python爬虫爬取广州大学教务系统的成绩(内网访问)
用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...
- Python爬虫 - 爬取百度html代码前200行
Python爬虫 - 爬取百度html代码前200行 - 改进版, 增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
- Python爬虫|爬取喜马拉雅音频
"GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...
- python爬虫爬取内容中,-xa0,-u3000的含义
python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310
- Python爬虫爬取全书网小说,程序源码+程序详细分析
Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...
- python爬虫—爬取英文名以及正则表达式的介绍
python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...
- 一个简单的python爬虫,爬取知乎
一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...
- python爬虫-爬取百度图片
python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...
随机推荐
- 前端基本知识(二):JS的原始链的理解
之前一直对于前端的基本知识不是了解很详细,基本功不扎实,但是前端开发中的基本知识才是以后职业发展的根基,虽然自己总是以一种实践是检验真理的唯一标准,写代码实践项目才是唯一,但是经常遇到知道怎么去解决这 ...
- Sass与Compass——回顾
compass 是sass的一个工具库 compass在sass 的基础上封装了一系列有用的模块,用来补充和丰富sass的工能, 安装: compass是用 ruby语言开发的,所以安装它之前必须安装 ...
- TFS实现需求工作项自动级联保存
目前在一个大型的金融客户软件研发平台项目实施和支持过程中,客户的质量管理团队基于该平台以及结合其它的平台数据,针对需求管理和业务过程需要拟定了一套完整的需求提出.评审.设计以及实现的流程.基于这套流程 ...
- Java语言基本语法(一)————关键字&标识符(Java语言标识符命名规范&Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )
一.关键字 关键字的定义和特点 定义:被Java语言赋予特殊含义,用做专门用途的字符串(单词). 特点:关键字中所有字母均为小写 下面列举一些常用的关键字. 用于定义数据类型的关键字:byte.sho ...
- NHibernate的常见问题及解决方案
问题1 : 异常:in expected: <end-of-text> (possibly an invalid or unmapped class name was used in th ...
- VMware WorkStation9.0虚拟机如何运行WINPE
VMware WorkStation9.0虚拟机如何运行WINPE...我们在使用VMware的过程中,有些时候需要让VMware来运行WINPE系统,比如在使用VMware进行系统封装的过程中,其中 ...
- 使用SigbalR发送通知
微信商城使用支付宝支付的时候,需要有个过度页面提示用户用浏览器打开页面去支付,等用户在浏览器支付完之后再打开微信(微信此时依旧显示的是过度页面),过度页面需要跳转到订单详情页面.那么这个过度页面怎么知 ...
- 如何把函数都用promise方式实现?
如何把函数都用promise方式实现? 我觉得这是一个好问题.当前在我所在的公司,只要用 NodeJS 进行开发,从框架到具体的应用实例到工具,已经全部迁移到以 promise 为中心开发方式.带来的 ...
- 读书笔记 effective c++ Item 22 将数据成员声明成private
我们首先看一下为什么数据成员不应该是public的,然后我们将会看到应用在public数据成员上的论证同样适用于protected成员.最后够得出结论:数据成员应该是private的. 1. 为什么数 ...
- Struts2初步接触
使用idea快速搭建Struts2的Maven项目 首先使用intelij idea部署Maven项目 1.jar包引入 pom.xml 我们用的是阿里云 我用的是最新版的Struts2核心 ...