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

这是上学期期末的时候,为了查成绩,然后去现学了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,好像也是一串随机值,但是跟地址栏那个不一样。这个也是一个随机验证。我们看看登陆页的源码,找找这个东西在哪里。

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
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请求,登录。

以下是登录的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#-*-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爬取方正教务系统的成绩 出成绩后发短信 发邮件(二)


# Python

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×