python3模拟登录爬取学校教务管理成绩

1.主要思路

建立一个session,发送含有用户名、密码、验证码的字典到登录页面;继续用这个session请求教务管理页面;最后利用这个会话请求成绩页面。

想象一下,你带着一个球(session),前方有两个防守队员。有了data才能越过第一个队员(登录页面),越过第二个队员(教务管理页面)才能到门前射门(成绩页面)。
哈哈哈。。

2.分析url

  • umm,找一个抓包工具,或者使用浏览器自带的开发者工具,小子在这篇文章使用Chrom。
  • 记得勾选开发者工具中的Preserve log。

看看登录页面,找到含有From Data的包,如果含有用户名、密码、验证码那么这个八成就是真正的登录post了。
在这里插入图片描述
后面的url处理也是如此,要多说一句验证码的情况。
可以选择人工输入,也可以选择自己做机器学习模型识别或者调用别的api识别,百度就有。笔者在本文中选择获取验证码到本地人工识别。。。懒。。

3.代码

https://github.com/Fyzjym/IMNU_Grade_Spider.git

#todo: keep alive in loginning, and get information from system.

import requests
import re



#testID and testPSD
#username = '*'
#password = '*'



# url
LoginUrl = "http://eip.imnu.edu.cn/EIP/syt/login/Login.htm"
checkCodeUrl = 'http://eip.imnu.edu.cn/EIP/syt/login/captcha.htm?code='
righturl = "http://eip.imnu.edu.cn:80/EIP/sytsso/other.htm?appId=NEWJWXT&uuid=ff8080815742d0ba015742d54b710004"
gardeUrl = "http://210.31.186.11/qbcj"

#agent
headerAgent = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}



# build session
sessionBuild = requests.session()


#get check code
def getCheckCode():
    try:
        valueCode = sessionBuild.get(checkCodeUrl, headers=headerAgent)
        f = open("valueCode.png", 'wb')
        f.write(valueCode.content)
        f.close()
        code = input("CheckNumber:")
        data['verification'] = str(code)
        print(data)
    except:
        print("Wrong in getting check code.")



#post data and get text
def spiderLoginandLogin(data):
    try:
        r = sessionBuild.post(LoginUrl, data, headerAgent)
        print(r.cookies.get_dict(),r.content,r.text,r.request,r.url,r.status_code)

        r1 = sessionBuild.get(righturl, headers = headerAgent)

        r2 = sessionBuild.get(gardeUrl, headers = headerAgent)
        return r2.text
    except:
        print("Spider in dangerous!")


#filter
def filter(text):
    v = text.replace("\t", '')
    v1 = v.replace("\n", '')
    v2 = v1.replace(' ', '')
    v3 = v2.replace("\r", '')
    #print(v3)
    value = re.findall(r'<td>(.*?)</td>', v3)

    #print(value)
    #print(value[0], value[1])
    return value

if __name__ == '__main__':

    username = input("U login name:")
    password = input("U login password:")

    # data
    data = {"username": username,
            "password": password,
            "verification": ''}

    getCheckCode()
    text = spiderLoginandLogin(data)
    value = filter(text)

    #devide
    b = list()
    for i in range(0, len(value), 8):
        b.append(value[i:i+8])
    for i in range(0,int(len(value)/8)):# 总字符串数/每一list中字符串数 = 总课程数
        print(b[i])

敲码时注意下分许过滤网页内容中含有的 \t \n \r 之类。

如有问题,请您指出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值