前几天看到网上有教程爬正方教务处的信息,心血来潮想做一个课程提醒功能微信号。加上刚好看到itchat框架索性就自己动手开发了起来。
总的来说这个小玩具分两大块操作,第一是爬虫抓取课程,第二是线程定时触发。这篇文章主要是针对爬虫模拟登录的操作。接下来进入开发过程:
运行环境:
python 2.7
itchat (1.2.19)
beautifulsoup4 (4.5.1)
requests (2.7.0)
window 10(64bit)
爬虫——模拟登陆由于课程每个学生都不一样且正方教务系统需要登陆才能获取学生的课程信息,第一步要做的便是模拟学生的登陆。
首先打开Firefox调试工具正常登陆,观察浏览器都做了post,get操作。
其中的一个post请求引起了我们的注意,其所带的参数如下:
查看对应登陆页面的标签id,同时我们注意到正方系统在第一次刷新的时候给我们分配了一个SessionId,所以在模拟登陆的时候需要将Cookie一起带上。
同理我们可以得到数据分别代表的是什么意义,这样子就可以通过发送相同的数据包达到我们模拟登陆目的,代码如下:
data = {
"__VIEWSTATE": VIEWSTATE,
"txtUserName": self.txtUserName, # 学生学号
"TextBox2": self.TextBox2, # 学生账号密码
"txtSecretCode": code, # 验证码
"RadioButtonList1": self.RadioButtonList1,
"Button1": "",
"lbLanguage": "",
"hidPdrs": "",
"hidsc": ""
}
那么接下的任务就是考虑如何获取对应数据包的值了。
首先__VIEWSTATE的值需要我们解析html标签获得,其次学生学号和学生密码则由用户自己填写,接着则是对验证码的处理了。
验证码的输入可以采用机器学习自动填写,也可以用人工输入。
在这里由于机器学习算法不是很懂,我们就采用人工输入......则接下来我们需要做的就是:解析html页面获取__VIEWSTATE的值
下载验证码图片
人工输入验证码图片
def get_VIEWSTATE(self, html):
try:
soup = BeautifulSoup(html,"html.parser")
VIEWSTATE = soup.find('input',
attrs={'name''__VIEWSTATE'})['value']
return VIEWSTATEexcept
Exception, e:
print u'网络未连接'
如何下载验证码图片呢首先需要通过解析html页面获取验证码图片的url
接着访问验证码的url将内容写入本地文件并保存。
通过人工识别的方法,将验证码输入到程序中,完成data数据的包装。
经过多次实验发现图片的url刷新之后固定不变,于是我们直接使用固定地址。
def get_checkcode(self):
code_url = 'http://jw.jluzh.com/CheckCode.aspx'
captcha_content = self.session.get(code_url).content
with open('CheckCode.gif', 'wb') as fp:
fp.write(captcha_content)
return raw_input('CheckCode : ')
当数据包装完成后我们只需将Cookie,data,消息头全部打包好发送出去就好了。
self.session = requests.session()
Loginresponse = self.session.post(self.url, data=data)
到此模拟正方教务系统登陆就大功告成了,具体的源码在github上面,欢迎关注哟
课程提醒功能现在已经完成了,额外又加多一些功能,例如提醒女朋友吃饭什么的,效果拔群。
接下来更的文章主要是讲述对教务处的课程信息进行处理,以及如何让itchat定时发送消息等。如果有什么好的功能想法可以私信我哟。