python爬虫登录正方教务管理系统获取成绩数据

2023-12-13 14:48

本文主要是介绍python爬虫登录正方教务管理系统获取成绩数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本程序以四川理工学院教务管理系统为例。。。。

准备工作:1.ruquests库的使用(或者urllib也可行)

    2.正则表达式的书写

                    3.HTTP通信基础

                    4.一些解析库的使用



准备一个浏览器监视工具,这里我是用的是fiddler下载地址点击打开链接

登录官网获取到登录系统url:http://61.139.105.138/default2.aspx


这里可以知道浏览器是先请求登录页面,让后转到去获取验证码图片。

仔细分析验证码连接发现:


这个请求方式是get但包含有cookies

所以模拟登录前获取验证码时需要带上cookies否则登录会一直提示验证码错误


查看发送的请求

__VIEWSTATE可以在登录页面的脚本中捕捉到 后面的数据便是post请求需要带上的数据

最后对于网页上的验证码问题,这里选择下载验证码图片并自动打开。

下面贴上模拟登录的代码

import requests
import re
from html.parser import *
import urllib.request
import os
x=[]
state=[]
class Scraper(HTMLParser):def handle_starttag(self,tag,attrs):if tag=='img':#验证码attrs=dict(attrs)if(attrs.__contains__('id')):x.append(attrs["src"])if tag=='input':#viewstateattrs=dict(attrs)if attrs.__contains__('name'):if attrs['name']=='__VIEWSTATE':state.append(attrs['value'])webpage=requests.get(url="http://61.139.105.138/default2.aspx")
Cookie=webpage.cookies#获取网页cookies
date=webpage.text
parser=Scraper()
parser.feed(date)
headers={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0;  TheWorld 7)',}
while True:url="http://61.139.105.138/CheckCode.aspx"#验证码所在连接pic=requests.get(url,cookies=Cookie,headers=headers)if os.path.exists(r'f://yanzheng.jpg'):os.remove(r'f://yanzheng.jpg')with open(r'f://yanzheng.jpg','wb')as f:f.write(pic.content)f.close()username=input("输入用户名: ")password=input("输入密码 ")os.startfile(r'f:yanzheng.jpg')ycode=input("输入弹出的验证码: ")payload={'__VIEWSTATE':state[0],'txtUserName':username,'TextBox2':password,'txtSecretCode':ycode,'RadioButtonList1':'%D1%A7%C9%FA','Button1':"",'lbLanguage':'','hidPdrs':'','hidsc':'',}Log_in=r"http://61.139.105.138/default2.aspx"r=requests.post(url=Log_in,data=payload,headers=headers,cookies=Cookie)#用正则算了pat=r'<title>(.*?)</title>'#获取标题的正则表达式x=re.findall(pat,r.text)if(x[0]=="欢迎使用正方教务管理系统!请登录"):print("登陆失败")albert="defer>alert\('(.*?)'\)"err=re.findall(albert,r.text)print(err[0])else:print("登陆成功")


过程中遇到需要判断登录是否成功,这里选择识别标记字符,我这边抓取了网页的标题,如果不成功标题就会是"欢迎使用正方教务管理系统!请登录"

在登录失败的情况下依然可以通过正则表达式获取登录失败信息

最后便是进入成绩查询界面,依旧先通过fiddler观察浏览器的行为:



    可以看出get请求相关信息是学号,姓名,项目代码(姓名可以在登录页面抓取)

    值得注意的是headers中必须含有referer否则会被弹出

    下面贴出相关代码:

 #抓一下名字catch='<span id="xhxm">(.*?)</span></em>'name=re.findall(catch,r.text)name=name[0]name=name[:-2]print(name)break
name=str(name).replace(r'\x','%')#扩大适用性
name=name.upper()
name=name[2:]lheaders={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0;  TheWorld 7)','Referer':'http://61.139.105.138/xs_main.aspx?xh='+username#扩大适用性}
html=requests.get("http://61.139.105.138/xscjcx_dq.aspx?xh="+username+"&xm="+name+"&gnmkdm=N121605",cookies=Cookie,headers=lheaders)
#最后处理成绩信息
selectall=r'<td>(.*?)</td>'*17
result=re.findall(selectall,html.text)
xm=result[0]#项目分离
forma=[]
temp=''
for i in range(17):forma.append('')#17位的数据存放处理好的数据
for index in range(17):for item in result:temp=format("% -15s"%str(item[index]).strip())forma[index]+=tempfor each in forma:print(each)
input("查询结束按下任意键退出")   


这就是整个爬虫实现的过程,允许相关输入错误后再次输入


最后贴上整个项目代码:

import requests
import re
from html.parser import *
import urllib.request
import os
import csv
x=[]
state=[]
class Scraper(HTMLParser):def handle_starttag(self,tag,attrs):if tag=='img':#验证码attrs=dict(attrs)if(attrs.__contains__('id')):x.append(attrs["src"])if tag=='input':#viewstateattrs=dict(attrs)if attrs.__contains__('name'):if attrs['name']=='__VIEWSTATE':state.append(attrs['value'])webpage=requests.get(url="http://61.139.105.138/default2.aspx")
Cookie=webpage.cookies#获取网页cookies
date=webpage.text
parser=Scraper()
parser.feed(date)
headers={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0;  TheWorld 7)',}
while True:url="http://61.139.105.138/CheckCode.aspx"#验证码所在连接pic=requests.get(url,cookies=Cookie,headers=headers)if os.path.exists(r'f://yanzheng.jpg'):os.remove(r'f://yanzheng.jpg')with open(r'f://yanzheng.jpg','wb')as f:f.write(pic.content)f.close()username=input("输入用户名: ")password=input("输入密码 ")os.startfile(r'f:yanzheng.jpg')ycode=input("输入弹出的验证码: ")payload={'__VIEWSTATE':state[0],'txtUserName':username,'TextBox2':password,'txtSecretCode':ycode,'RadioButtonList1':'%D1%A7%C9%FA','Button1':"",'lbLanguage':'','hidPdrs':'','hidsc':'',}Log_in=r"http://61.139.105.138/default2.aspx"r=requests.post(url=Log_in,data=payload,headers=headers,cookies=Cookie)#用正则算了pat=r'<title>(.*?)</title>'#获取标题的正则表达式x=re.findall(pat,r.text)if(x[0]=="欢迎使用正方教务管理系统!请登录"):print("登陆失败")else:print("登陆成功")#抓一下名字catch='<span id="xhxm">(.*?)</span></em>'name=re.findall(catch,r.text)name=name[0]name=name[:-2]print(name)break
name=str(name).replace(r'\x','%')#扩大适用性
name=name.upper()
name=name[2:]lheaders={'User-Agent':r'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0;  TheWorld 7)','Referer':'http://61.139.105.138/xs_main.aspx?xh='+username#扩大适用性}
html=requests.get("http://61.139.105.138/xscjcx_dq.aspx?xh="+username+"&xm="+name+"&gnmkdm=N121605",cookies=Cookie,headers=lheaders)
#最后处理成绩信息
selectall=r'<td>(.*?)</td>'*17
result=re.findall(selectall,html.text)
xm=result[0]#项目分离
forma=[]
csvfile=open('f://result.csv','w',newline='')
writer=csv.writer(csvfile)
temp=''
for i in range(17):forma.append('')#17位的数据存放处理好的数据
for index in range(17):for item in result:temp=format("% -15s"%str(item[index]).strip())forma[index]+=tempfor each in forma:print(each)for num,item in enumerate(result):for index,value in enumerate(item):#处理下result里面的无规则数据if value==" ":result[num][index]=''for item in result:writer.writerow(item)
csvfile.close()
input("爬虫完成,结果存在F盘result.csv文件下")



这篇关于python爬虫登录正方教务管理系统获取成绩数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/488858

相关文章

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.