使用python爬取方正教务系统的成绩 出成绩后发短信 发邮件(一)

7个月前 (05-01) wang Python 0评论 已收录 448℃ 浏览数:292

这个是上学期期末的时候,为了查成绩,然后去现学了python,然后根据网上的教程去模范写的一个获取教务系统成绩的爬虫。后面加上了腾讯云的短信服务还有qq邮箱smtp发件服务。判断是否出了成绩,然后给我发短信,发邮件。哈哈。然后这学期开学就涉及到找实习的事,所以一直拖到现在闲一点,想把这个坑补上。

Python 版本3.6.3 需要安装几个库,看运行报错自行安装即可。

http://jwxt.i.cqut.edu.cn 是我们教务系统的地址,打开后发现做了简单的加密。


 

地址变为了 http://jwxt.i.cqut.edu.cn/(csoirujk15b4nq45szsv1hu2)/Default2.aspx 我看其他的学校有的是可以把Default2.aspx改为Default3.aspx Default4.aspx之类的 就可以跳过验证码,但是我们学校好像做的挺好的,都需要验证码。那我们来看看验证码的地址。

 


 

好像是一个地址。我们打开把那串随机值加上,打开这个地址看看。


那串随机值就是用来做验证的。下面还有很多的地方需要这个随机值。

我们看到,可以通过地址来获取验证码。但是这个验证码的识别不是很好做,所以我们还是来手动输入验证码的值,然后尝试登录。

我们拦截一下登录请求。


我们看到有一个__VIEWSTATE,好像也是一串随机值,但是跟地址栏那个不一样。这个也是一个随机验证。我们看看登陆页的源码,找找这个东西在哪里。

找到了,就是一个隐藏在源码里的一个随机值,在登录的时候需要传过去,那我们就获取一下传过去就可以了

其他的就是账号密码,验证码。还有一个这个东西。


我们看看这个编码后是什么值。


就是一个死值,那我们直接传过去即可。我们看看登录需要的参数如下。

data={  
    '__VIEWSTATE':__VIEWSTATE,  
    'txtUserName':'学号',  
    'TextBox2':'密码',  
    'txtSecretCode':code,  
    'RadioButtonList1':'%D1%A7%C9%FA',  
    'Button1':"",  
    'lbLanguage':'',  
    'hidPdrs':'',  
    'hidsc':'',  
} 

 

那我们来捋一下思路。如何用python模拟登录。

1.首先获取jwxt.i.cqut.edu.cn的源码

2.我们会被重定向到 http://jwxt.i.cqut.edu.cn/(随机值)/Default2.aspx 这个地址

3.我们需要获取随机值然后去http://jwxt.i.cqut.edu.cn/(随机值)/CheckCode.aspx 这个地址,获取验证码,然后保存到本地

4.然后我们需要获取到http://jwxt.i.cqut.edu.cn/(随机值)/Default2.aspx 这里面的__VIEWSTATE 这个值

5.我们输入验证码,构造请求,去post请求,登录。

以下是登录的代码

#-*-coding:utf-8-*-
import os 
import re
from lxml import etree
import requests
import sys
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
import threading
import time
from qcloudsms_py import SmsSingleSender
from qcloudsms_py.httpclient import HTTPError

#访问教务系统,前面分析过了,提交数据时要用这个值。先得到__VIEWSTATE的值。
s = requests.session()
url = "http://jwxt.i.cqut.edu.cn"
response = s.get(url)

#获取到有随机值的地址
newUrl = response.url

#获取__VIEWSTATE值
selector = etree.HTML(response.content)
__VIEWSTATE = selector.xpath('//*[@id="form1"]/input/@value')[0]

#获取验证码
imgUrl = newUrl.replace('Default2.aspx','CheckCode.aspx')
imgresponse = s.get(imgUrl, stream=True)
image = imgresponse.content

#保存验证码
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(image)  
    f.close()  

#打开验证吗
os.startfile(r'f:yanzheng.jpg')

#手动输入验证码
code = input("输入弹出的验证码: ")

#构造参数
data={  
    '__VIEWSTATE':__VIEWSTATE,  
    'txtUserName':'学号',  
    'TextBox2':'密码',  
    'txtSecretCode':code,  
    'RadioButtonList1':'%D1%A7%C9%FA',  
    'Button1':"",  
    'lbLanguage':'',  
    'hidPdrs':'',  
    'hidsc':'',  
}  

#提交表头,里面的参数是电脑各浏览器的信息。模拟成是浏览器去访问网页。
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}  

#登陆教务系统
response = s.post(newUrl,data=data,headers=headers)

print(response.content.decode('gb2312'))


然后我们运行一下,看看结果。


可以看到我们已经登录成功了。这是第一步,下一个文章来写我们如何去获取成绩并发邮件,发短信等功能。
使用python爬取方正教务系统的成绩 出成绩后发短信 发邮件(二)

博主

Just do it. Now or never.

相关推荐

    嗨、骚年、快来消灭0回复。