From 094b6efe7b9f6b044ff6567bd7e7dc813dc1f50b Mon Sep 17 00:00:00 2001 From: liwf75 Date: Wed, 16 Oct 2019 17:29:12 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=88=ACurp=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hhuUrpSpider.py | 9 +- selcetYearUrp.py | 218 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 223 insertions(+), 4 deletions(-) create mode 100644 selcetYearUrp.py diff --git a/hhuUrpSpider.py b/hhuUrpSpider.py index 1b78833..34b4c66 100644 --- a/hhuUrpSpider.py +++ b/hhuUrpSpider.py @@ -29,8 +29,7 @@ getPersonalInfoTimes = 0 # 识别验证码次数,若超过一个阈值则认为学号和密码不符,停止爬虫 getGradesTimes = 0 - -#保存登陆成功的Cookies +# 保存登陆成功的Cookies cookie_jar = http.cookiejar.CookieJar() cookie_jar_handler = urllib.request.HTTPCookieProcessor(cookiejar=cookie_jar) opener = urllib.request.build_opener(cookie_jar_handler) @@ -200,5 +199,7 @@ def getPA(score): if __name__ == '__main__': - getPersonalInfo() - getGrades() + # 拿到学籍信息 + getPersonalInfo() + # 拿到本学期成绩 + getGrades() diff --git a/selcetYearUrp.py b/selcetYearUrp.py new file mode 100644 index 0000000..4158b94 --- /dev/null +++ b/selcetYearUrp.py @@ -0,0 +1,218 @@ +# encoding: utf-8 +''' +@author: weiyang_tang +@contact: weiyang_tang@126.com +@file: HohaiUrpSpider_01.py +@time: 2019-02-18 16:03 +@desc: 1.利用百度的ocr,对教务系统的验证码进行识别; + 2. 利用urllib库进行模拟登陆和爬取 + 3. 利用 beautifulSoup对网页进行解析,获取所需数据 + 4. 利用 xlwt,xlrd,xlutils进行excel的新建和读取和修改 +''' + +import urllib.request, urllib.parse, urllib.error +import http.cookiejar +from BaiduOcr import getVcode +from bs4 import BeautifulSoup +import xlwt +import xlrd +from xlutils.copy import copy +import requests; + +SNO = '1562810212' # 学号 +pwd = 'urpscode' # 密码 +SName = '' # 学生姓名不用写 + +capurl = "http://jwurp.hhuc.edu.cn/validateCodeAction.do" # 验证码地址 +loginUrl = "http://jwurp.hhuc.edu.cn/loginAction.do" # 登陆地址 + +logInMaxTryTimes = 10 # 识别验证码最多多少次试错机会,若超过一个阈值则认为学号和密码不符,停止爬虫 +getPersonalInfoTimes = 0 # 识别验证码次数,若超过一个阈值则认为学号和密码不符,停止爬虫 +getGradesTimes = 0 + +# 保存登陆成功的Cookies +cookie_jar = http.cookiejar.CookieJar() +cookie_jar_handler = urllib.request.HTTPCookieProcessor(cookiejar=cookie_jar) +opener = urllib.request.build_opener(cookie_jar_handler) + +picPath = 'D:/image.jpg' # 验证码存放的位置 + + +# 登陆教务系统 +def AutomaticLogin(): # 利用百度ocr识别验证码,为了弥补识别可能出错的缺陷,识别错误多次识别,若多次识别仍是错误,则认为是学号和密码不符 + + # get identifying code image + picture = opener.open(capurl).read() + # restore the image + local = open(picPath, 'wb') + local.write(picture) # 将验证码写入本地 + local.close() + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36', + 'Host': 'jwurp.hhuc.edu.cn', + 'Origin': 'http://jwurp.hhuc.edu.cn', + 'Referer': 'http://jwurp.hhuc.edu.cn/loginAction.do' + } + code = getVcode() + print(code) + postdatas = {'zjh': SNO, 'mm': pwd, 'v_yzm': code} + # 模拟登陆教务处 + data = urllib.parse.urlencode(postdatas).encode(encoding='gb2312') + request = urllib.request.Request(loginUrl, data, headers) + try: + response = opener.open(request) + html = response.read().decode('gb2312') + # print(html) + soup = BeautifulSoup(html, 'lxml') + print(soup.title.string) + title = soup.title.string + if (title.__contains__('错误信息')): + # print('登录失败') + AutomaticLogin() + except urllib.error.HTTPError as e: + print(e.code) + + +def getGrades(): + global getGradesTimes + scoreList = [] # 存放成绩的 + AutomaticLogin() + # 获取本学期成绩 + gradeUrl = 'http://jwurp.hhuc.edu.cn/bxqcjcxAction.do' + # 获取及格成绩 + #passUrl = 'http://jwurp.hhuc.edu.cn/xjInfoAction.do?oper=xjxx' + passUrl = 'http://jwurp.hhuc.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2018-2019%D1%A7%C4%EA%B5%DA%B6%FE%D1%A7%C6%DA(%B6%FE%D1%A7%C6%DA)' + passURL = 'http://jwurp.hhuc.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2018-2019%D1%A7%C4%EA%B5%DA%B6%FE%D1%A7%C6%DA(%B6%FE%D1%A7%C6%DA)' + detailURL = 'http: //jwurp.hhuc.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2016-2017%D1%A7%C4%EA%C7%EF(%C1%BD%D1%A7%C6%DA)' + #gradeRequest = urllib.request.Request(gradeUrl) + gradeRequest = urllib.request.Request(passUrl) + responseGrade = opener.open(gradeRequest).read().decode('gb2312') + # print(responseGrade) + # s = requests.Session() + # html = s.get(url=passUrl) + # main = html.content.decode('gbk') + # soup = BeautifulSoup(main,'lxml') + soup = BeautifulSoup(responseGrade, 'lxml') + if (soup.a.string != None): + title = soup.a.string + if (title.__contains__('错误信息')): + getGradesTimes = getGradesTimes + 1 + if (getGradesTimes <= logInMaxTryTimes): + getGrades() + return None + else: + print('请检查账号和密码是否正确') + return None + # print(soup.title.string) + try: + old_excel = xlrd.open_workbook('data/' + SNO + '_' + SName + '.xls', formatting_info=True) + except Exception: + getPersonalInfo() + getGrades() + return None + new_excel = copy(old_excel) + ws = new_excel.add_sheet('本学期成绩') + rowIndex = 0 + colIndex = 0 + + for th in soup.find_all(name='th'): + ws.write(rowIndex, colIndex, th.string.strip()) + colIndex = colIndex + 1 + print('%-60s' % th.string.strip(), end=' ') + print() + rowIndex = 1 + for tr in soup.find_all(class_='odd'): + scoreList.append([]) + colIndex = 0 + for td in tr.find_all(name='td'): + scoreList[rowIndex - 1].append(td.string.strip()) + ws.write(rowIndex, colIndex, td.string.strip()) + colIndex = colIndex + 1 + print('%-60s' % td.string.strip(), end=' ') + rowIndex = rowIndex + 1 + print() + gpa = getGPA(scoreList) + ws.write(rowIndex + 2, colIndex, '本学期平均绩点为' + str(gpa)) + print(scoreList) + new_excel.save('data/' + SNO + '_' + SName + '.xls') + + +def getPersonalInfo(): + global getPersonalInfoTimes + personalInfo = [] + AutomaticLogin() + personalInfoUrl = 'http://jwurp.hhuc.edu.cn/xjInfoAction.do?oper=xjxx' # 个人信息的url + gradeRequest = urllib.request.Request(personalInfoUrl) + responseGrade = opener.open(gradeRequest).read().decode('gb2312') + myWorkbook = xlwt.Workbook() + mySheet = myWorkbook.add_sheet('个人信息') + rowIndex = 0 + soup = BeautifulSoup(responseGrade, 'lxml') + if (soup.title.string != None): + title = soup.title.string + if (title.__contains__('错误信息')): + getPersonalInfoTimes = getPersonalInfoTimes + 1 + if (getPersonalInfoTimes <= logInMaxTryTimes): + getPersonalInfo() + return None + else: + return None + for table in soup.find_all(id='tblView'): + for tr in table.find_all(name='tr'): + personalInfo.append([]) + colIndex = 0 + for td in tr.find_all(name='td'): + if td.string != None: + personalInfo[rowIndex].append(td.string.strip()) + mySheet.write(rowIndex, colIndex, td.string.strip()) + colIndex = colIndex + 1 + print(td.string.strip(), end='') + rowIndex = rowIndex + 1 + print() + global SName + SName = personalInfo[0][3] + myWorkbook.save('data/' + SNO + '_' + SName + '.xls') + + +''' +计算本学期的平均绩点 +''' + + +def getGPA(scoreList): + sumCredit = 0 + sumPA = 0.0 + for rowIndex in range(len(scoreList)): + if scoreList[rowIndex][5] == '必修': + sumCredit = sumCredit + float(scoreList[rowIndex][4]) + sumPA = sumPA + getPA(scoreList[rowIndex][9]) * float(scoreList[rowIndex][4]) + try: + avgPA = sumPA / sumCredit + print('本学期平均绩点为' + str(avgPA)) + return avgPA + except Exception: + pass + + +def getPA(score): + if score == "优秀": return 5.0 + if score == "良好": return 4.5 + if score == "中等": return 3.5 + if score == "及格": return 2.5 + if score == "不及格": return 0.0 + if float(score) >= 90 and float(score) <= 100: return 5.0 + if float(score) >= 85 and float(score) <= 89: return 4.5 + if float(score) >= 80 and float(score) <= 84: return 4.0 + if float(score) >= 75 and float(score) <= 79: return 3.5 + if float(score) >= 70 and float(score) <= 74: return 3.0 + if float(score) >= 65 and float(score) <= 69: return 2.5 + if float(score) >= 60 and float(score) <= 65: return 2.0 + if float(score) <= 59: return 0.0 + + +if __name__ == '__main__': + # 拿到学籍信息 + getPersonalInfo() + # 拿到本学期成绩 + getGrades() From 99c2bdfdbfac0007b0c85585a08644f247426968 Mon Sep 17 00:00:00 2001 From: liwf75 Date: Wed, 16 Oct 2019 18:00:49 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=88=AC=E5=8F=96=E5=85=A8=E5=B9=B4?= =?UTF-8?q?=E6=88=90=E7=BB=A9=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- selcetYearUrp.py => allYearUrp.py | 110 ++++++++++++++++++------------ 1 file changed, 67 insertions(+), 43 deletions(-) rename selcetYearUrp.py => allYearUrp.py (72%) diff --git a/selcetYearUrp.py b/allYearUrp.py similarity index 72% rename from selcetYearUrp.py rename to allYearUrp.py index 4158b94..24173db 100644 --- a/selcetYearUrp.py +++ b/allYearUrp.py @@ -20,7 +20,7 @@ import requests; SNO = '1562810212' # 学号 -pwd = 'urpscode' # 密码 +pwd = '' # 密码 SName = '' # 学生姓名不用写 capurl = "http://jwurp.hhuc.edu.cn/validateCodeAction.do" # 验证码地址 @@ -94,48 +94,72 @@ def getGrades(): # main = html.content.decode('gbk') # soup = BeautifulSoup(main,'lxml') soup = BeautifulSoup(responseGrade, 'lxml') - if (soup.a.string != None): - title = soup.a.string - if (title.__contains__('错误信息')): - getGradesTimes = getGradesTimes + 1 - if (getGradesTimes <= logInMaxTryTimes): - getGrades() - return None - else: - print('请检查账号和密码是否正确') - return None - # print(soup.title.string) - try: - old_excel = xlrd.open_workbook('data/' + SNO + '_' + SName + '.xls', formatting_info=True) - except Exception: - getPersonalInfo() - getGrades() - return None - new_excel = copy(old_excel) - ws = new_excel.add_sheet('本学期成绩') - rowIndex = 0 - colIndex = 0 - - for th in soup.find_all(name='th'): - ws.write(rowIndex, colIndex, th.string.strip()) - colIndex = colIndex + 1 - print('%-60s' % th.string.strip(), end=' ') - print() - rowIndex = 1 - for tr in soup.find_all(class_='odd'): - scoreList.append([]) - colIndex = 0 - for td in tr.find_all(name='td'): - scoreList[rowIndex - 1].append(td.string.strip()) - ws.write(rowIndex, colIndex, td.string.strip()) - colIndex = colIndex + 1 - print('%-60s' % td.string.strip(), end=' ') - rowIndex = rowIndex + 1 - print() - gpa = getGPA(scoreList) - ws.write(rowIndex + 2, colIndex, '本学期平均绩点为' + str(gpa)) - print(scoreList) - new_excel.save('data/' + SNO + '_' + SName + '.xls') + content = soup.find_all('td', align="center") + # 将信息放入一个list中,创建new_list(方便后续存入excel) + data_list = [] + for data in content: + data_list.append(data.text.strip()) + new_list = [data_list[i:i + 7] for i in range(0, len(data_list), 7)] + # 数据存入excel表格 + book = xlwt.Workbook() + sheet1 = book.add_sheet('sheet1', cell_overwrite_ok=True) + heads = [u'课程号', u'课序号', u'课程名', u'英文课程名', u'学分', u'课程属性', u'成绩'] + print(u'\n准备将数据存入表格...') + ii = 0 + for head in heads: + sheet1.write(0, ii, head) + ii += 1 + i = 1 + for list in new_list: + j = 0 + for data in list: + sheet1.write(i, j, data) + j += 1 + i += 1 + book.save('JiaoWuChengJi.xls') + print(u'\n录入成功!') + # if (soup.a.string != None): + # title = soup.a.string + # if (title.__contains__('错误信息')): + # getGradesTimes = getGradesTimes + 1 + # if (getGradesTimes <= logInMaxTryTimes): + # getGrades() + # return None + # else: + # print('请检查账号和密码是否正确') + # return None + # # print(soup.title.string) + # try: + # old_excel = xlrd.open_workbook('data/' + SNO + '_' + SName + '.xls', formatting_info=True) + # except Exception: + # getPersonalInfo() + # getGrades() + # return None + # new_excel = copy(old_excel) + # ws = new_excel.add_sheet('本学期成绩') + # rowIndex = 0 + # colIndex = 0 + # + # for th in soup.find_all(name='th'): + # ws.write(rowIndex, colIndex, th.string.strip()) + # colIndex = colIndex + 1 + # print('%-60s' % th.string.strip(), end=' ') + # print() + # rowIndex = 1 + # for tr in soup.find_all(class_='odd'): + # scoreList.append([]) + # colIndex = 0 + # for td in tr.find_all(name='td'): + # scoreList[rowIndex - 1].append(td.string.strip()) + # ws.write(rowIndex, colIndex, td.string.strip()) + # colIndex = colIndex + 1 + # print('%-60s' % td.string.strip(), end=' ') + # rowIndex = rowIndex + 1 + # print() + # gpa = getGPA(scoreList) + # ws.write(rowIndex + 2, colIndex, '本学期平均绩点为' + str(gpa)) + # print(scoreList) + # new_excel.save('data/' + SNO + '_' + SName + '.xls') def getPersonalInfo(): From b98fe89b538ea6aa4e18fd41a37cb8c552d0464b Mon Sep 17 00:00:00 2001 From: liwf75 Date: Wed, 16 Oct 2019 18:01:09 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JiaoWuChengJi.xls | Bin 5632 -> 17920 bytes ..._\346\235\216\344\270\207\346\226\271.xls" | Bin 0 -> 5632 bytes hhuUrpSpider.py | 2 +- test7.py | 2 +- urp.py | 11 ++++++++--- urpTest1.py | 2 +- urpTest2.py | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 "data/1562810212_\346\235\216\344\270\207\346\226\271.xls" diff --git a/JiaoWuChengJi.xls b/JiaoWuChengJi.xls index 37e43abc3b2930fa3b260893dfac3bf693b7e520..ba422a678b19d8cfa7bac40844f6af55f3ff4c1f 100644 GIT binary patch literal 17920 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 V9&Vmoxjzg>Lewyuojc!m z&wO*{%$b>O-#=oG?|Z52gm}t4@ynUfagsHLx6mG!#)X3SqoaiBXAat+E|vdK1jglH zA+s{&aNfJwTuZL^3GvB`8E>N&`3m3Fa*xC|^d>4UVp*s@bXfFZE^14j1d}h5)T<(` z@6vjr)(6${b*<+sGpzMoDU##XDmhXgn^^}ffznFfRDG9^+LBka&!@`RQX=obW^~&w zCOh6{%7VW29X2`>r7FA2emu?y9v)ZHFXUDqBV(3wuhzvVDAZB`wB=qGiXaFzW zGG|!v%RMbkF#f%vy#Jd-c~?|$wWJ*ZU!OSK)46-+&Zxlsdm9>ef3;#|Gy3}nqi`Jt z9Bg(h8IR(=vM6S4dOE&y@56~zP09F_b+GtkuYd6R_AK>WY9jV^b|4I~JK8>K;`DJ0 z2I>NlfSu)-`UlJV$>%fl)ph_MyT%Sx2QlwNLo)6kJT`Q4=)D0Qy=>RPp+L)g1feiJ zdP`I23E!HorajL@oBT0}eLrkVP$Ke66Wl(qt8|-o9EopxoU0y{T#OT{4TQqsx=1(- ze>sR7ieSL52}JA~^!;PY{7#Mj`o8ADhHc;6nR|aS-uVRHOpKMq7&vR+(C*FAt`7#1 z@%-3e=bSF6@!g?>ak6IPn*CdK_@D&DmKxc=72QwXM;6m_x|45%%ZSIEWM%WXE-tPn zLS-|?aJbVeM&b?+fhp^_7>H@znlJ7oK-1UuTw|q^YNf3w&qnOcc;0p=VqECp>>4{T z+lHUVS1j*(BhiW^0r;(DbHl>bQ@SJiS{cpk6Bl+BT>K8IdEWp8w&)rJc*`+msn(a-;CVnZ^S_M&$waKxd>I z%4J&f%}nhvOY7~lkt?)argbr*gfS|Ym!uktA5@!%^lc@^328Z6KYdJl2HHEmYj}0? zj<4&lMf<>#6ZaP%__%(bOvUb5%e{`zgHmNxS$p@e9I8)0Eu0ga)#q9}ck|d=Imd@z z7bqE+lNPH$PHW6Wj1msAfH;2#`GBbEAU_aJF`*W1yjtW8SjV2e8caWpsKwtj)Uu#s zcwMR%NAPNqGl&6J!e2o6~br5y9^7M(md3DGcZes0?gaex3B5LIUaSXru zL>LU8Y%%v7%?$sh^#)vE9)gfoF z4;-Ix76D!9BI;b_BKkBLh(7Tz8Lt*OBjqW3+#Ns_E~3^H7g1{}5Ve>KUM+G)u13u{ zF#DXfV>TJN20Yhpyv}VJ5OtU_ULA5qDp6A>*VV~Yo$27IldC#2fT+V<^XiZ@a&5|f zg6hn45q+BFBF?P}h+524uNFBYvs3nYs&$=r1W z;W^>eAZKJTYWh>68cSS6e{Ke%eu*1ro-jVoeL~L2Eh*bl)tTojk`W&0I$u6nxGOJ} zvk~C!$sjqmnCR`nQ=X?Y|F3fzUp_CD|7QdmWdlANam(E#y?FM?09O9|OQ~d9>Bumb z&ZngRUr5^)jNT{R(y4xQpHKI5Y;Xd) Date: Wed, 16 Oct 2019 18:02:21 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...212_\346\235\216\344\270\207\346\226\271.xls" | Bin 5632 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "data/1562810212_\346\235\216\344\270\207\346\226\271.xls" diff --git "a/data/1562810212_\346\235\216\344\270\207\346\226\271.xls" "b/data/1562810212_\346\235\216\344\270\207\346\226\271.xls" deleted file mode 100644 index f28c27e3b65ba72e9b22010ae880004d608cb120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHLYiv|S6h3#iFDQLXX{%JF1*ISq*}L0zyQ@$@1Ya!lA*C$RhwK*8TC~!T3W16e z6H5(=Q3CN15)(8gpfRZ;8ugz)G^hkM8Wl7qCWaWJ#ure(@7&!>xjzg>Lewyuojc!m z&wO*{%$b>O-#=oG?|Z52gm}t4@ynUfagsHLx6mG!#)X3SqoaiBXAat+E|vdK1jglH zA+s{&aNfJwTuZL^3GvB`8E>N&`3m3Fa*xC|^d>4UVp*s@bXfFZE^14j1d}h5)T<(` z@6vjr)(6${b*<+sGpzMoDU##XDmhXgn^^}ffznFfRDG9^+LBka&!@`RQX=obW^~&w zCOh6{%7VW29X2`>r7FA2emu?y9v)ZHFXUDqBV(3wuhzvVDAZB`wB=qGiXaFzW zGG|!v%RMbkF#f%vy#Jd-c~?|$wWJ*ZU!OSK)46-+&Zxlsdm9>ef3;#|Gy3}nqi`Jt z9Bg(h8IR(=vM6S4dOE&y@56~zP09F_b+GtkuYd6R_AK>WY9jV^b|4I~JK8>K;`DJ0 z2I>NlfSu)-`UlJV$>%fl)ph_MyT%Sx2QlwNLo)6kJT`Q4=)D0Qy=>RPp+L)g1feiJ zdP`I23E!HorajL@oBT0}eLrkVP$Ke66Wl(qt8|-o9EopxoU0y{T#OT{4TQqsx=1(- ze>sR7ieSL52}JA~^!;PY{7#Mj`o8ADhHc;6nR|aS-uVRHOpKMq7&vR+(C*FAt`7#1 z@%-3e=bSF6@!g?>ak6IPn*CdK_@D&DmKxc=72QwXM;6m_x|45%%ZSIEWM%WXE-tPn zLS-|?aJbVeM&b?+fhp^_7>H@znlJ7oK-1UuTw|q^YNf3w&qnOcc;0p=VqECp>>4{T z+lHUVS1j*(BhiW^0r;(DbHl>bQ@SJiS{cpk6Bl+BT>K8IdEWp8w&)rJc*`+msn(a-;CVnZ^S_M&$waKxd>I z%4J&f%}nhvOY7~lkt?)argbr*gfS|Ym!uktA5@!%^lc@^328Z6KYdJl2HHEmYj}0? zj<4&lMf<>#6ZaP%__%(bOvUb5%e{`zgHmNxS$p@e9I8)0Eu0ga)#q9}ck|d=Imd@z z7bqE+lNPH$PHW6Wj1msAfH;2#`GBbEAU_aJF`*W1yjtW8SjV2e8caWpsKwtj)Uu#s zcwMR%NAPNqGl&6J!e2o6~br5y9^7M(md3DGcZes0?gaex3B5LIUaSXru zL>LU8Y%%v7%?$sh^#)vE9)gfoF z4;-Ix76D!9BI;b_BKkBLh(7Tz8Lt*OBjqW3+#Ns_E~3^H7g1{}5Ve>KUM+G)u13u{ zF#DXfV>TJN20Yhpyv}VJ5OtU_ULA5qDp6A>*VV~Yo$27IldC#2fT+V<^XiZ@a&5|f zg6hn45q+BFBF?P}h+524uNFBYvs3nYs&$=r1W z;W^>eAZKJTYWh>68cSS6e{Ke%eu*1ro-jVoeL~L2Eh*bl)tTojk`W&0I$u6nxGOJ} zvk~C!$sjqmnCR`nQ=X?Y|F3fzUp_CD|7QdmWdlANam(E#y?FM?09O9|OQ~d9>Bumb z&ZngRUr5^)jNT{R(y4xQpHKI5Y;Xd) Date: Wed, 16 Oct 2019 18:02:49 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JiaoWuChengJi.xls | Bin 17920 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 JiaoWuChengJi.xls diff --git a/JiaoWuChengJi.xls b/JiaoWuChengJi.xls deleted file mode 100644 index ba422a678b19d8cfa7bac40844f6af55f3ff4c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17920 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