importdatetimeimporttimefrom email.header importHeaderimportrequestsimportreimportsmtplibfrom email.mime.text importMIMETextfrom bs4 importBeautifulSoupdeflistener():#在这里我通过模拟登陆的方式登陆
#一般来说这里填写的是username跟password
#但我们学校后台将用户名和密码进行了加密
#通过观察浏览器的请求数据跟页面源码猜出学校后台的加密方式
data={#出于学校安全考虑,这里就不给出加密方式了
'encoded':'xxxxxxxxxxxxxxxxxxx'}
session=requests.Session()
session.post('http://jwc./jsxsd/xk/LoginToXk',data=data)#请求--1学期的所有成绩
r_data ={'kksj': '--1','kcxz': '','kcmc': '','xsfs': 'all'}
r= session.post('http://jwc./jsxsd/kscj/cjcx_list', data=r_data)#对爬回来数据进行封装
soup = BeautifulSoup(r.text, 'html.parser')#返回已有的成绩列表
oldList =toList(soup)
max=len(oldList)#这里用死循环定时爬取成绩页面分析是否分布新成绩
while(True):#post跟get方式不能乱用,不然数据会出错
r = session.post('http://jwc./jsxsd/kscj/cjcx_list',data=r_data)
soup= BeautifulSoup(r.text, 'lxml')#print(soup.prettify())
length = len(soup.find_all(string=pile('--1')))-1
print("course_length:",length)if (r.status_code == 200 and length !=0):if (length >max):#查询新出的成绩列表
newlist =toList(soup)#获取两个列表不同之处,不同的就是新成绩
diflist =compareTwoList(oldList, newlist)
oldList=newlistif diflist=='':
send("unkowned Error","unkowned Error")else:#有新成绩了,发送邮件通知我
send('you have new course sorce!!', diflist)
max=lengthprint('last running time was:',datetime.datetime.now())#定时作用,500s查一次
time.sleep(500)else:#发送邮件断开连接了 print("had disconnected...")
send("your server is disconnected!!!","your server is disconnected!!!")break
defsend(title,msg):
mail_host= ''
#你的qq邮箱名,没有.com
mail_user = '你的qq邮箱名,没有.com'
#密码(部分邮箱为授权码)
mail_pass = '授权码'
#邮件发送方邮箱地址
sender = '发送方邮箱地址'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['yoletpig@']#设置email信息
#邮件内容设置
message = MIMEText(msg, 'plain', 'utf-8')#邮件主题
message['Subject'] = Header(title,'utf-8')#发送方信息
message['From'] =sender#接受方信息
message['To'] =receivers[0]#登录并发送邮件
try:#smtpObj = smtplib.SMTP()
## 连接到服务器
#smtpObj.connect(mail_host, 25)
smtpObj =smtplib.SMTP_SSL(mail_host)#登录到服务器
smtpObj.login(mail_user, mail_pass)#发送
smtpObj.sendmail(
sender,receivers,message.as_string())#退出
smtpObj.quit()print('success')exceptsmtplib.SMTPException as e:print('error', e) #打印错误
deftoList(soup):
flag=True
list=[]
strs= ''
#对tr标签下的td进行遍历并取值
for tr in soup.find_all('tr'):ifflag:
flag=False;continuei= 1
for td intr.stripped_strings:if (i == 1 or i == 2):
i+= 1
continuestrs+= "_" +td
i+= 1list.append(strs)
strs= ''
returnlistdefcompareTwoList(oldList,newList):
diflist=''
for sub innewList:#判断是否唯一
if(oldList.count(sub)==0):
diflist=subbreak
returndiflistif __name__ == '__main__':
listener()
如果觉得《python成绩查询系统_教你用python爬虫监控教务系统 查成绩快人一步!》对你有帮助,请点赞、收藏,并留下你的观点哦!