最近在学习python,发现通过python爬取网页信息确实方便,以前用C++写了个简单的爬虫,爬取指定网页的信息,代码随便一写都几百行,而要用python完成相同的工作,代码量相当少。前几天看到了一个博客上讲解如何使用python写的爬虫爬取成绩信息,看了之后,自己实战了一番,并且达到了相同的效果。

整个过程和那篇博客所写的过程相同,不过由于我们学校的成绩查询系统要输入验证码,所以步骤稍微繁琐一点。

1.了解查询过程

使用的工具当然也是HttpFox插件。开启HttpFox插件后,我登录了成绩系统并且查询了成绩。然后发现httpFox检测到了很多条信息:

可以看到,当我们第一次访问成绩管理系统的时候,浏览器向服务器发送了一个GET请求,而服务器返回的消息头部中给定了Cookie值,如下图:

接下来,浏览器向http://gsinfo.whu.edu.cn/servlet/GenImg发送信息,获取验证码信息,可以发现发送消息的头部加载COOKIE信息:

然后,我输入用户名、密码、验证码登录系统,发现向http://gsinfo.whu.edu.cn/servlet/Login_use这个网址发送了POST信息,然后检查发送的POST数据,可以看到用户名,密码,验证码,这些信息都发送过去了。

这里可以看到,who变量表示的是用户的类别(学生还是老师),id,pwd,yzm分别表示的是学号,密码和验证码,而后面的submit.x和submit.y则不用管它。

登录之后,点击了“查询成绩”的按钮之后,才最终显示了成绩的页面,如下图:

运用HttpFox监测之后,我们大致了解了查询成绩的基本流程:

首先,我们访问http://gsinfo.whu.edu.cn,浏览器得到Cookie,然后获取到相应Cookie对应的验证码,得到验证码图片的网址是http://gsinfo.whu.edu.cn/servlet/GenImg。

其次,我们输入了学号,密码,验证码后,POST给http://gsinfo.whu.edu.cn/servlet/Login_use,如果登录成功,则进入到了成绩查询系统。

最后,我们要向http://gsinfo.whu.edu.cn/score/Svlt_QueryScore这个网址POST查询信息,得到最终的查询页面。

2.用python实现模拟登录

知道了成绩查询的大体流程之后,我们就可以使用python来模拟学生登录系统并且查询成绩。整个查询过程中最重要的一点是要得到登录时的Cookie值,并且后面访问时也要传入这个Cookie值,否则会出现登录失败的情况。我就在验证码这里遇到了点困难,明明输入的验证码就是看到的验证码,但是还是登录失败。最终发现,原来是Cookie的值发生了变化,导致登录时所需要的验证码已经不是你得到的验证码了。

这里给出了我写的python代码,用户需要输入学号,密码,和所看到的验证码,然后就能看到自己的成绩了。

# -*- coding: utf-8 -*-
#模拟登陆武汉大学研究生管理系统
import urllib2,cookielib
import urllib,string
import cStringIO,Image,re
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
opener.addheaders.append(('User-Agent','Mozilla/5.0 (Windows NT 5.1; rv:25.0) Gecko/20100101 Firefox/25.0'))
#opener.addheaders.append(('Connection','Keep-Alive'))
#获取验证码opener.open(urllib2.Request('http://gsinfo.whu.edu.cn'))imgurl = 'http://gsinfo.whu.edu.cn/servlet/GenImg'
userid = raw_input("学号:")
pwd = raw_input("密码:")
res = opener.open(urllib2.Request(imgurl))
tempIm = cStringIO.StringIO(res.read())
im = Image.open(tempIm)
im.show()
yzm = raw_input("验证码:")
#需要post的数据
postdata = urllib.urlencode({'who':'student','id':userid,'pwd':pwd,'yzm':yzm,'submit.x':'52','submit.y':'13'})
req = urllib2.Request(url = 'http://gsinfo.whu.edu.cn/servlet/Login_use',data = postdata)
opener.open(req)
#已经成功进入系统
#查询成绩
postscore = urllib.urlencode({'queryType':'1','sYear':'-1','function':'queryScoreStu','Submit':'%C8%B7+%B6%A8','flag':'unnull'})
req = urllib2.Request(url = 'http://gsinfo.whu.edu.cn/score/Svlt_QueryScore',data = postscore)result = opener.open(req)
#返回打印内容
info = result.read()#打印成绩
pattern = r'<TD width="90" height="25" align="center" valign="middle">([^>]*?)</TD>[\s\S]*?height="25">([^>]*?)</TD>[\s\S]*?25[\s\S]*?25[\s\S]*?25[\s\S]*?25[\s\S]*?25[\s\S]*?25">[\s\S]*?25">([^>]*?)</TD>'
p = re.compile(pattern)
score = p.findall(info)
for i in range(len(score)):print score[i][1],score[i][0],string.strip(score[i][2])

代码的运行结果如下:

总结:本文介绍了如何利用python编写一个小爬虫,爬取武汉大学研究生管理系统中学生的成绩。我目前算是初学python,发现python确实是一门强大的编程语言。毕竟这只是个小练习,还有些不完善,没有考虑异常的情况。

参考文章:

[Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)

python爬取网页信息相关推荐

  1. Python 爬取网页信息并保存到本地爬虫爬取网页第一步【简单易懂,注释超级全,代码可以直接运行】

    Python 爬取网页信息并保存到本地[简单易懂,代码可以直接运行] 功能:给出一个关键词,根据关键词爬取程序,这是爬虫爬取网页的第一步 步骤: 1.确定url 2.确定请求头 3.发送请求 4.写入 ...

  2. python爬取网页信息,用正则达到快刀斩乱麻的效果

    # -*- coding: utf-8 -*- """ Created on Fri Jun 14 17:37:44 2019@author: User "&q ...

  3. [python] 常用正则表达式爬取网页信息及分析HTML标签总结

    这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...

  4. python正则表达式爬取网页数据_常用正则表达式爬取网页信息及HTML分析总结

    Python爬取网页信息时,经常使用的正则表达式及方法. 1.获取 标签之间内容2.获取 超链接之间内容3.获取URL最后一个参数命名图片或传递参数4.爬取网页中所有URL链接5.爬取网页标题titl ...

  5. 常用正则表达式爬取网页信息及分析HTML标签总结

    这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...

  6. 常用正则表达式爬取网页信息及HTML分析总结

    Python爬取网页信息时,经常使用的正则表达式及方法. 1.获取<tr></tr>标签之间内容 2.获取<a href..></a>超链接之间内容 3 ...

  7. Python爬虫:Xpath爬取网页信息(附代码)

    Python爬虫:Xpath爬取网页信息(附代码) 上一次分享了使用Python简单爬取网页信息的方法.但是仅仅对于单一网页的信息爬取一般无法满足我们的数据需求.对于一般的数据需求,我们通常需要从一个 ...

  8. qt爬取网页信息_豆瓣TOP250数据爬取

    一.问题描述 用python爬取网页数据是现在流行的一种快速获取数据的方法,简单快捷.最近小编通过教程学习完成了豆瓣TOP250数据的爬取.下面就简单介绍一下如何用python程序实现豆瓣网页信息的爬 ...

  9. python爬取网页表格数据匹配,python爬虫——数据爬取和具体解析

    标签:pattern   div   mat   txt   保存   关于   json   result   with open 关于正则表达式的更多用法,可参考链接:https://blog.c ...

最新文章

  1. Bit,Byte,Word,Dword,Qword
  2. ascx页面获取标签的通用方法
  3. 【机器学习】Facets:评估机器学习数据集质量利器 (来自Google、可交互、可可视化)...
  4. ACM_基础知识(二)
  5. 和信虚拟终端的全面部署-虚拟终端网络工程实施
  6. shiro+springmvc+mybatis【转】
  7. 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统-计算机系统应用.PDF...
  8. Maven 教程:IDEA开发环境中maven 项目配置JDK9,JDK10,JDK11,JDK12..等EA版本的配置方法 系列教程一
  9. android GitLab使用教程
  10. 高程数据下载——DLR_SRTM_说明
  11. 计算机网络概述上海电力,上海电力大学2021考研复试计算机网络考试大纲
  12. 落幕,致我的大学生活
  13. http://coffeejp.com/bbs/forum.php?mod=viewthread,问题列表_华泰证券网络路演_新浪网
  14. Amazon Alexa系列介绍(1)--综述
  15. tp5欢迎页 (获取系统信息)
  16. stick棍子by Ye
  17. 前端技术面试核心问题(持续更新)
  18. 《嵌入式系统 - RT-Thread开发笔记》 第三部分 RT-Thread 移植与设备驱动开发 - 第1章 RT-Thread 开发环境搭建 (Ubuntu)
  19. Java简单搭建免签个人支付宝当面付收款接口,无需挂APP,官方接口无风险
  20. 讯为iTOP4412开发板ARM-linux 使用OPENCV调用USB摄像头

热门文章

  1. AcWing数据结构
  2. CSS写三角形和一个小风车案例
  3. 浏览器攻击框架BeEF Part 5:攻击Web应用与攻击网络
  4. c语言只需编译 不需连接,C语言程序设计-中国大学mooc
  5. 算法设计与分析——蒙特卡罗算法判定两个集合是否相等
  6. 如何修改Linux的远程端口
  7. 特征工程之缺失值处理
  8. 初学python100例-案例35 数字反转 少儿编程python编程实例讲解
  9. SQLyog错误状态码:2002的一种解决方法
  10. 8155/8255/8295参数对比