1.主要思路
建立一个session,发送含有用户名、密码、验证码的字典到登录页面;继续用这个session请求教务管理页面;最后利用这个会话请求成绩页面。
想象一下,你带着一个球(session),前方有两个防守队员。有了data才能越过第一个队员(登录页面),越过第二个队员(教务管理页面)才能到门前射门(成绩页面)。
哈哈哈。。
2.分析url
- umm,找一个抓包工具,或者使用浏览器自带的开发者工具,小子在这篇文章使用Chrom。
- 记得勾选开发者工具中的Preserve log。
看看登录页面,找到含有From Data的包,如果含有用户名、密码、验证码那么这个八成就是真正的登录post了。
后面的url处理也是如此,要多说一句验证码的情况。
可以选择人工输入,也可以选择自己做机器学习模型识别或者调用别的api识别,百度就有。笔者在本文中选择获取验证码到本地人工识别。。。懒。。
3.代码
#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 之类。
如有问题,请您指出。