这是上学期期末的时候,为了查成绩,然后去现学了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
| 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
s = requests.session() url = "http://jwxt.i.cqut.edu.cn" response = s.get(url)
newUrl = response.url
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爬取方正教务系统的成绩 出成绩后发短信 发邮件(二)