Skip to content

Commit 15eef84

Browse files
authored
Merge pull request Jack-Cherish#44 from ZYSzys/master
add zhengfang_system_spider
2 parents 34bf45e + 612d532 commit 15eef84

File tree

8 files changed

+357
-0
lines changed

8 files changed

+357
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
* [网易云音乐批量下载](https://github.com/Jack-Cherish/python-spider/tree/master/Netease "悬停显示")
3939
* [B站视频和弹幕批量下载](https://github.com/Jack-Cherish/python-spider/tree/master/bilibili "悬停显示")
4040
* [京东商品晒单图下载](https://github.com/Jack-Cherish/python-spider/tree/master/dingdong "悬停显示")
41+
* [正方教务管理系统爬虫](https://github.com/Jack-Cherish/python-spider/tree/master/zhengfang_system_spider "悬停显示")
4142
* [其它](#其它)
4243

4344
## 爬虫小工具

zhengfang_system_spider/README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# ZhengFang_System_Spider
2+
对正方教务管理系统个人课表,学生成绩,绩点等简单爬取
3+
4+
## 依赖环境
5+
python 3.6
6+
### python库
7+
http请求:requests,urllib
8+
数据提取:re,lxml,bs4
9+
存储相关:os,sys
10+
验证码处理:PIL
11+
12+
## 下载安装
13+
在终端输入如下命令:
14+
```bash
15+
git clone git@github.com:Jack-Cherish/python-spider.git
16+
```
17+
18+
## 使用方法
19+
20+
### 安装依赖包
21+
```bash
22+
pip install -r requirements.txt
23+
```
24+
25+
### 运行
26+
在当前目录下输入:
27+
```
28+
cd zhengfang_system_spider
29+
python spider.py
30+
```
31+
运行爬虫,按提示输入学校教务网,学号,密码,输入验证码
32+
33+
![运行时](/zhengfang_system_spider/screenshot/spider.png)
34+
35+
稍等几秒钟,当前ZhengFang_System_Spider文件夹下就会生成zhengfang.txt
36+
个人课表,成绩绩点均已保存到该文本文件中
37+
38+
![结果](/zhengfang_system_spider/screenshot/zf.png)

zhengfang_system_spider/code.jpg

1.93 KB
Loading
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
lxml==4.2.1
2+
requests==2.18.4
3+
Pillow==5.2.0
4+
beautifulsoup4==4.6.0
41.7 KB
Loading
255 KB
Loading

zhengfang_system_spider/spider.py

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
#!/usr/bin/env python
2+
#-*- coding: utf-8 -*-
3+
4+
__author__ = 'ZYSzys'
5+
6+
import requests
7+
import re
8+
import os
9+
import sys
10+
import urllib
11+
import getpass
12+
from lxml import etree
13+
from PIL import Image
14+
from imp import reload
15+
from bs4 import BeautifulSoup
16+
17+
18+
class Who:
19+
def __init__(self, user, pswd):
20+
self.user = user
21+
self.pswd = pswd
22+
23+
24+
class Tool:
25+
rma = re.compile('<a href=.*?>|</a>')
26+
rmtb = re.compile('<br />|</br>|<br>')
27+
rmtr = re.compile('<td>|</td>|<tr>|</tr>|<tr class="alt">|<tr class="datelisthead">')
28+
rmtime1 = re.compile('<td align="Center" width="7%">.*?</td>')
29+
rmtime2 = re.compile('<td class="noprint" align="Center".*?>.*?</td>')
30+
31+
def replace(self, x):
32+
x = re.sub(self.rma, ' ', x)
33+
x = re.sub(self.rmtb, '---', x)
34+
x = re.sub(self.rmtr, ' ', x)
35+
x = re.sub(self.rmtime1, '\n', x)
36+
x = re.sub(self.rmtime2, '', x)
37+
return x.strip()
38+
39+
40+
def Getgrade(response):
41+
html = response.content
42+
soup = BeautifulSoup(html, 'lxml')
43+
trs = soup.find(id="Datagrid1").findAll("tr")
44+
Grades = []
45+
keys = []
46+
tds = trs[0].findAll("td")
47+
tds = tds[:2] + tds[3:5] + tds[6:9]
48+
for td in tds:
49+
keys.append(td.string)
50+
for tr in trs[1:]:
51+
tds = tr.findAll("td")
52+
tds = tds[:2] + tds[3:5] + tds[6:9]
53+
values = []
54+
for td in tds:
55+
values.append(td.string)
56+
one = dict((key, value) for key, value in zip(keys, values))
57+
Grades.append(one)
58+
return Grades
59+
60+
61+
def Getgradetestresults(trs):
62+
results = []
63+
k = []
64+
for td in trs[0].xpath('.//td/text()'):
65+
k.append(td)
66+
trs = trs[1:]
67+
for tr in trs:
68+
tds = tr.xpath('.//td/text()')
69+
v = []
70+
for td in tds:
71+
v.append(td)
72+
one = dict((i, j) for i, j in zip(k, v))
73+
results.append(one)
74+
return results
75+
76+
77+
class University:
78+
def __init__(self, student, baseurl):
79+
reload(sys)
80+
self.student = student
81+
self.baseurl = baseurl
82+
self.session = requests.session()
83+
self.session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
84+
85+
def Login(self):
86+
url = self.baseurl+'/default2.aspx'
87+
res = self.session.get(url)
88+
cont = res.content
89+
selector = etree.HTML(cont)
90+
__VIEWSTATE = selector.xpath('//*[@id="form1"]/input/@value')[0]
91+
imgurl = self.baseurl + '/CheckCode.aspx'
92+
imgres = self.session.get(imgurl, stream=True)
93+
img = imgres.content
94+
with open('code.jpg', 'wb') as f:
95+
f.write(img)
96+
jpg = Image.open('{}/code.jpg'.format(os.getcwd()))
97+
jpg.show()
98+
jpg.close
99+
code = input('输入验证码:')
100+
RadioButtonList1 = u"学生"
101+
data = {
102+
"__VIEWSTATE": __VIEWSTATE,
103+
"txtUserName": self.student.user,
104+
"TextBox1": self.student.pswd,
105+
"TextBox2": self.student.pswd,
106+
"txtSecretCode": code,
107+
"RadioButtonList1": RadioButtonList1,
108+
"Button1": "",
109+
"lbLanguage": ""
110+
}
111+
loginres = self.session.post(url, data=data)
112+
logcont = loginres.text
113+
pattern = re.compile(
114+
'<form name="Form1".*?action=(.*?) id="Form1">', re.S)
115+
res = re.findall(pattern, logcont)
116+
try:
117+
if res[0][17:29] == self.student.user:
118+
print('Login succeed!')
119+
except:
120+
print('Login failed! Maybe Wrong password ! ! !')
121+
return
122+
pattern = re.compile('<span id="xhxm">(.*?)</span>')
123+
xhxm = re.findall(pattern, logcont)
124+
name = xhxm[0].replace('同学', '')
125+
self.student.urlname = urllib.parse.quote_plus(str(name))
126+
return True
127+
128+
def GetClass(self):
129+
self.session.headers['Referer'] = self.baseurl + \
130+
'/xs_main.aspx?xh=' + self.student.user
131+
kburl = self.baseurl + '/xskbcx.aspx?xh='+self.student.user + \
132+
'&xm='+self.student.urlname+'&gnmkdm=N121603'
133+
kbresponse = self.session.get(kburl)
134+
kbcont = kbresponse.text
135+
pattern = re.compile('<td.*?align="Center".*?>(.*?)</td>', re.S)
136+
contents = re.findall(pattern, kbcont)
137+
tool = Tool()
138+
f = open(os.getcwd()+'/zhengfang.txt', 'w')
139+
f.write(u'本学期课表:'+'\n')
140+
cnt = 1
141+
l = [u'周一', u'周二', u'周三', u'周四', u'周五', u'周六', u'周日']
142+
for day in l:
143+
for i in contents:
144+
if u'星期' in i:
145+
continue
146+
elif u'第' in i:
147+
if day in i:
148+
con = tool.replace(i)
149+
f.write(str(cnt)+':\t'+con+'\n')
150+
cnt += 1
151+
else:
152+
continue
153+
f.write('\n')
154+
f.close()
155+
print('Download class succeed!')
156+
157+
def GetGrade(self):
158+
self.session.headers['Referer'] = self.baseurl + \
159+
'/xs_main.aspx?xh=' + self.student.user
160+
gradeurl = self.baseurl + '/xscjcx.aspx?xh='+self.student.user + \
161+
'&xm='+self.student.urlname+'&gnmkdm=N121605'
162+
graderesponse = self.session.get(gradeurl)
163+
gradecont = graderesponse.content
164+
soup = BeautifulSoup(gradecont, 'lxml')
165+
__VIEWSTATE = soup.findAll(name="input")[2]["value"]
166+
self.session.headers['Referer'] = gradeurl
167+
data = {
168+
"__EVENTTARGET": "",
169+
"__EVENTARGUMENT": "",
170+
"__VIEWSTATE": __VIEWSTATE,
171+
"hidLanguage": "",
172+
"ddlXN": "",
173+
"ddlXQ": "",
174+
"ddl_kcxz": "",
175+
"btn_zcj": u'历年成绩'
176+
}
177+
grares = self.session.post(gradeurl, data=data)
178+
grades = Getgrade(grares)
179+
totup = 0
180+
totdown = 0
181+
f = open(os.getcwd()+'/zhengfang.txt', 'a+')
182+
f.write('\n\n\n'+u'历年成绩:'+'\n')
183+
for i in grades[0]:
184+
f.write('%-13s\t' % i)
185+
f.write('\n')
186+
for each in grades:
187+
for one in each:
188+
f.write('%-15s\t' % each[one])
189+
f.write('\n')
190+
totup = totup + float(each[u'绩点']) * float(each[u'学分'])
191+
totdown = totdown + float(each[u'学分'])
192+
f.write('\n'+u'平均绩点: '+'%.2f\t\t\t' % (totup / totdown) +
193+
u'总学分绩点: '+'%.2f\t\t\t' % totup + u'总学分: '+'%.2f\n' % totdown)
194+
f.close()
195+
print('Download grade succeed!')
196+
197+
def GradeTestResults(self):
198+
self.session.headers['Referer'] = self.baseurl + \
199+
'/xs_main.aspx?xh=' + self.student.user
200+
gtrurl = self.baseurl + '/xsdjkscx.aspx?xh='+self.student.user + \
201+
'&xm='+self.student.urlname+'&gnmkdm=N121606'
202+
gtrresponse = self.session.get(gtrurl)
203+
gtrcontent = gtrresponse.text
204+
gtrhtml = etree.HTML(gtrcontent)
205+
trs = gtrhtml.xpath('//table[@class="datelist"]/tr')
206+
f = open(os.getcwd()+'/zhengfang.txt', 'a+')
207+
f.write('\n\n\n'+u'等级考试成绩:'+'\n')
208+
results = Getgradetestresults(trs)
209+
for one in results[0]:
210+
f.write('%-10s\t' % one)
211+
f.write('\n')
212+
for each in results:
213+
for one in each:
214+
f.write('%-10s\t' % each[one])
215+
f.write('\n')
216+
f.close()
217+
print('Download grade test results succeed!')
218+
219+
220+
if __name__ == "__main__":
221+
url = input("学校教务网站(如http://115.236.84.162):")
222+
user = input("学号:")
223+
pswd = getpass.getpass("密码:")
224+
who = Who(user, pswd)
225+
univ = University(who, url)
226+
if univ.Login():
227+
univ.GetClass()
228+
univ.GetGrade()
229+
univ.GradeTestResults()

zhengfang_system_spider/zhengfang.txt

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
本学期课表:
2+
1: 电工电子技术基础AⅡ---周一第1,2节{第2-16周|双周}---郜园园/章云(章云,郜园园)---学10609(实验室)
3+
2: 计算机网络A---周一第3,4节{第2-16周|双周}---吴晓平(吴晓平)---学10311(实验室)
4+
3: 数据库原理与技术B---周一第6,7节{第1-12周}---刘丽娟(刘丽娟)---学1502(智慧教室)
5+
4: 数据库原理与技术B---周一第8节{第1-12周}---刘丽娟(刘丽娟)---学1502(智慧教室)
6+
7+
5: 数据库原理与技术B---周二第1,2节{第1-16周}---刘丽娟(刘丽娟)---学10309(实验室)
8+
6: 计算机网络A---周二第3,4,5节{第1-16周}---吴晓平(吴晓平)---教1512(多媒体)
9+
7: J2EE程序设计---周二第6,7节{第1-16周}---陈文辉(陈文辉)---教5402(多媒体)
10+
11+
8: 大学体育(篮球)---周三第3,4节{第1-17周}---田晓鹏---东湖风雨操场
12+
9: J2EE程序设计---周三第6,7节{第1-16周}---陈文辉(陈文辉)---学10309(实验室)
13+
10: 毛泽东思想和中国特色社会主义理论体系概论---周三第8,9节{第2-16周}---张国泉---教1401(多媒体)---2018年06月30日(10:20-11:10)---学10203(实验室)
14+
15+
11: 中国文化英语---周四第1,2节{第1-16周}---陈献---教5302(多媒体)
16+
12: 电工电子技术基础AⅡ---周四第3,4,5节{第1-16周}---郜园园/章云(章云,郜园园)---教5403(多媒体)
17+
13: 物联网工程概论A---周四第6,7节{第2-16周|双周}---孔汶汶/张建锋/冯海林/吴剑(孔汶汶,张建锋)---学10603(实验室)
18+
19+
14: 毛泽东思想和中国特色社会主义理论体系概论---周五第3,4节{第2-16周}---张国泉---教1401(多媒体)---2018年06月30日(10:20-11:10)---学10203(实验室)
20+
15: 物联网工程概论A---周五第8,9节{第1-16周}---孔汶汶/张建锋/冯海林/吴剑(孔汶汶,张建锋)---教1512(多媒体)
21+
22+
23+
16: 思辨与创新(网络课程)---周日第12节{第1-15周}---网络教师---------用经济学智慧解读中国(网络课程)---周日第12节{第1-15周}---网络教师---
24+
25+
26+
27+
28+
历年成绩:
29+
学年 学期 课程名称 课程性质 学分 绩点 成绩
30+
2016-2017 1 思想道德修养与法律基础 必修 3 2.80 78
31+
2016-2017 1 形势与政策 必修 0.5 4.50 优
32+
2016-2017 1 大学生心理健康教育 必修 1 3.30 83
33+
2016-2017 1 大学生职业发展 必修 0.5 3.80 88
34+
2016-2017 1 高级语言程序设计 必修 4 4.40 94
35+
2016-2017 1 学业指导 必修 0.5 4.40 94
36+
2016-2017 1 大学计算机基础A 必修 1 3.90 89
37+
2016-2017 1 高等数学AI 必修 4 4.50 95
38+
2016-2017 1 线性代数A 必修 3 4.60 96
39+
2016-2017 1 大学英语BI 必修 4 3.60 86
40+
2016-2017 1 军事理论 必修 0.5 3.50 良
41+
2016-2017 1 军事技能训练 必修 0.5 4.50 95
42+
2016-2017 1 大学体育I 必修 0.75 2.30 73
43+
2016-2017 2 马克思主义基本原理概论 必修 3 2.20 72
44+
2016-2017 2 形势与政策 必修 0.5 4.50 优
45+
2016-2017 2 信息技术导论 必修 1.5 4.40 94
46+
2016-2017 2 数据结构C 必修 3.5 4.10 91
47+
2016-2017 2 数据结构C实习 必修 1 4.50 优
48+
2016-2017 2 应用文写作 必修 2 3.90 89
49+
2016-2017 2 高等数学AII 必修 5 4.20 92
50+
2016-2017 2 大学物理AI 必修 3 2.90 79
51+
2016-2017 2 大学英语BII 必修 4 3.20 82
52+
2016-2017 2 大学体育II 必修 0.75 2.50 75
53+
2017-2018 1 中国近现代史纲要 必修 2 2.30 73
54+
2017-2018 1 形势与政策 必修 0.5 4.50 优
55+
2017-2018 1 电工电子技术基础AI 必修 3.5 2.60 76
56+
2017-2018 1 概率论与数理统计A 必修 4 4.70 97
57+
2017-2018 1 大学物理AII 必修 3 3.30 83
58+
2017-2018 1 大学物理A实验 必修 1.5 3.40 84
59+
2017-2018 1 英语报刊选读 必修 2 3.40 84
60+
2017-2018 1 大学体育III 必修 0.75 3.00 80
61+
2017-2018 1 生命科学与生物技术导论B 选修 2 3.50 85
62+
2017-2018 1 动物福利B(双语) 选修 2 4.50 95
63+
2017-2018 1 JAVA程序设计B 选修 3 4.50 95
64+
2017-2018 1 面向对象程序设计B 选修 3.5 4.10 91
65+
2017-2018 1 专业认知实习 选修 0.5 4.70 97
66+
2017-2018 1 个人理财规划(网络课程) 选修 2 4.50 优
67+
2017-2018 1 淘宝店铺设计与制作(实验室开放项目) 选修 1 3.20 82
68+
2017-2018 2 大学体育(篮球) 必修 0.75 2.10 71
69+
2017-2018 2 电工电子技术基础AⅡ 必修 3.5 2.30 73
70+
2017-2018 2 电工电子技术基础实习A 必修 1 2.50 中
71+
2017-2018 2 中国文化英语 必修 2 3.20 82
72+
2017-2018 2 数据库原理与技术B 选修 3 4.10 91
73+
2017-2018 2 数据库原理与技术实习B 选修 1 3.50 良
74+
2017-2018 2 思辨与创新(网络课程) 选修 2 3.90 89
75+
2017-2018 2 用经济学智慧解读中国(网络课程) 选修 3 4.80 97.97
76+
77+
平均绩点: 3.70 总学分绩点: 351.68 总学分: 95.00
78+
79+
80+
81+
等级考试成绩:
82+
学年 学期 等级考试名称 准考证号 考试日期 成绩 听力成绩 阅读成绩 写作成绩 综合成绩
83+
2016-2017 1 英语四级 330391162105502 2016-12-17 563 212 190 161 0
84+
2016-2017 2 英语六级 330391171213315 2017-6-17 434 112 195 127 0
85+
2017-2018 1 英语六级 330391172204918 2017-12-16 415 135 151 129 0

0 commit comments

Comments
 (0)