def get_score(self, score_year=None, score_term=None, **kwargs): ''' 成绩信息 获取入口 ''' score_url = self.school_url['SCORE_URL'] + self.account try: view_state = self._get_view_state(score_url, **kwargs) except RequestException: raise ScoreException(self.code, '获取成绩请求参数失败') payload = { '__VIEWSTATE': view_state, 'Button2': u'在校学习成绩查询', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) if res.status_code == 302: raise ScoreException(self.code, '成绩接口已关闭') elif res.status_code != 200: raise RequestException except RequestException: raise ScoreException(self.code, '获取成绩信息失败') html = res.content.decode('GB18030') tip = get_tip(html) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, html).get_score(score_year, score_term)
def get_score(self, score_year=None, score_term=None, use_api=3, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 2.接口3 ... :param kwargs: requests模块参数 return ''' score_url = self.school_url['SCORE_URL'][use_api] + self.user.account try: view_state = self._get_view_state(score_url, **kwargs) except TooManyRedirects: msg = '可能是成绩接口地址不对,请尝试更改use_api值' raise ScoreException(self.code, msg) except RequestException: msg = '获取成绩请求参数失败' raise ScoreException(self.code, msg) payload = { '__VIEWSTATE': view_state, 'hidLanguage:': '', 'btn_zcj': '历年成绩', 'ddl_kcxz': '', 'ddlXN': '', 'ddlXQ': '' } payload1 = { '__VIEWSTATE': view_state, 'hidLanguage:': '', 'Button1': '成绩统计', 'ddl_kcxz': '', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) res1 = self._post(score_url, data=payload1, **kwargs) except TooManyRedirects: raise ScoreException(self.code, '成绩接口已关闭') except RequestException: raise ScoreException(self.code, '获取成绩信息失败') html = res.content.decode('GB18030') html1 = res1.content.decode('GB18030') tip = get_alert_tip(html) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, html, use_api, html1).get_score(score_year, score_term)
def _html_parse_of_score(self): tag = "Datagrid1" table = self.soup.find("table", {"id": tag}) if not table: raise ScoreException(self.code, '获取成绩信息失败') rows = table.find_all('tr') rows.pop(0) self.score = {} self.score_info = {} self.all_college = {} pjzjd = self.get_pjxfjd() zyzrs = self.get_student_num() pjzjd_text = 'pjzjd' zyzrs_text = 'zyzrs' for row in rows: cells = row.find_all("td") # 学年学期 year = cells[0].text term = cells[1].text # 课程名 lesson_code = cells[2].text.strip() lesson_name = cells[3].text.strip() lesson_nature = cells[4].text.strip() credit = cells[6].text.strip() or 0 point = cells[7].text.strip() or 0 peace_score = cells[8].text.strip() or 0 term_end_score = cells[10].text.strip() or 0 all_score = cells[12].text.strip() or 0 teach_college = cells[16].text.strip() score_dict = { "lesson_code": lesson_code, "lesson_name": lesson_name, "lesson_nature": lesson_nature, "credit": float(credit), "point": float(point), "peace_score": self.handle_data(peace_score), "term_end_score": self.handle_data(term_end_score), "all_score": self.handle_data(all_score), "teach_college": teach_college } # 有其他成绩内容则输出 makeup_score = cells[14].text retake_score = cells[15].text if makeup_score != '\xa0': # 补考成绩 score_dict['bkcj'] = makeup_score if retake_score != '\xa0': # 重修成绩 score_dict['cxcj'] = retake_score # 组装数组格式的数据备用 self.all_college[zyzrs_text] = self.handle_data(zyzrs) self.all_college[pjzjd_text] = self.handle_data(pjzjd) self.score_info[year] = self.score_info.get(year, {}) self.score_info[year][term] = self.score_info[year].get(term, []) self.score_info[year][term].append(score_dict) self.score = { "score_info": self.score_info, "all_college": self.all_college }
def get_score(self, score_year=None, score_term=None, use_api=0, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 2.接口3 :param kwargs: requests模块参数 return ''' score_url = self.school_url['SCORE_URL'][use_api] + self.account try: view_state = self._get_view_state(score_url, **kwargs) except TooManyRedirects: msg = '可能是成绩接口地址不对,请尝试更改use_api值' raise ScoreException(self.code, msg) except RequestException: msg = '获取成绩请求参数失败' raise ScoreException(self.code, msg) payload = { '__VIEWSTATE': view_state, 'Button2': '在校学习成绩查询', 'btn_zcj': '历年成绩', 'btnCx': ' 查 询 ', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) if res.status_code == 302: raise ScoreException(self.code, '成绩接口已关闭') elif res.status_code != 200: raise RequestException except RequestException: raise ScoreException(self.code, '获取成绩信息失败') html = res.content.decode('GB18030') tip = get_alert_tip(html) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, html, use_api).get_score(score_year, score_term)
def get_score(self, year, term): ''' 返回成绩信息json格式 ''' try: if year: if term: return self.score_info[year][term] return self.score_info[year] except KeyError: raise ScoreException(self.code, '暂无成绩信息') return self.score_info
def _html_parse_of_score(self): table = self.soup.find("table", {"id": re.compile("Datagrid1", re.IGNORECASE)}) if not table: raise ScoreException(self.code, '获取成绩信息失败') rows = table.find_all('tr') rows.pop(0) year = self.year term = self.term self.score_info = {} for row in rows: cells = row.find_all("td") # 课程代码 lesson_code = cells[0].text # 课程名 lesson_name = cells[1].text # 学分 credit = cells[8].text.strip() or 0 point = cells[9].text.strip() or 0 # 最终成绩 score = cells[4].text.strip() or 0 score_dict = { "lesson_name": lesson_name, "credit": float(credit), "point": float(point), "score": self.handle_data(score) } # 有其他成绩内容则输出 makeup_score = cells[6].text # 补考成绩 retake_score = cells[7].text # 重修成绩 if makeup_score != '\xa0': # 补考成绩 score_dict['bkcj'] = makeup_score if retake_score != '\xa0': # 重修成绩 score_dict['cxcj'] = retake_score # 组装数组格式的数据备用 self.score_info[year] = self.score_info.get(year, {}) self.score_info[year][term] = self.score_info[year].get(term, []) self.score_info[year][term].append(score_dict)
def _html_parse_of_score(self): tag = "Datagrid1" if self.use_api != 3 else "DataGrid1" table = self.soup.find("table", {"id": tag}) if not table: raise ScoreException(self.code, '获取成绩信息失败') rows = table.find_all('tr') rows.pop(0) self.score_info = {} for row in rows: cells = row.find_all("td") # 学年学期 year = cells[0].text term = cells[1].text # 课程名 lesson_name = cells[3].text.strip() credit = cells[6].text.strip() or 0 point = cells[7].text.strip() or 0 score = cells[8].text.strip() or 0 score_dict = { "lesson_name": lesson_name, "credit": float(credit), "point": float(point), "score": self.handle_data(score) } # 有其他成绩内容则输出 makeup_score = cells[10].text retake_score = cells[11].text if makeup_score != '\xa0': # 补考成绩 score_dict['bkcj'] = makeup_score if retake_score != '\xa0': # 重修成绩 score_dict['cxcj'] = retake_score # 组装数组格式的数据备用 self.score_info[year] = self.score_info.get(year, {}) self.score_info[year][term] = self.score_info[year].get(term, []) self.score_info[year][term].append(score_dict)
def get_score(self, score_year=None, score_term=None, use_api=0, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 2.接口3 ... :param kwargs: requests模块参数 return ''' score_url = self.school_url['SCORE_URL'][use_api] + self.user.account try: view_state = self._get_view_state(score_url, **kwargs) except TooManyRedirects: msg = '可能是成绩接口地址不对,请尝试更改use_api值' raise ScoreException(self.code, msg) except RequestException: msg = '获取成绩请求参数失败' raise ScoreException(self.code, msg) if score_year != None and score_term != None: # 按学年查询 payload = { '__VIEWSTATE': view_state, 'ddlXN': score_year, 'ddlXQ': score_term, 'txtQSCJ': '0', 'txtZZCJ': '100', 'Button1': '按学期查询' } elif score_year != None and score_term == None: # 按学期查询 payload = { '__VIEWSTATE': view_state, 'ddlXN': score_year, 'ddlXQ': '', 'txtQSCJ': '0', 'txtZZCJ': '100', 'Button5': '按学年查询' } elif score_year == None and score_term == None: # 在校成绩查询 payload = { '__VIEWSTATE': view_state, 'Button2': '在校学习成绩查询', 'btn_zcj': '历年成绩', 'btnCx': ' 查 询 ', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) except TooManyRedirects: raise ScoreException(self.code, '成绩接口已关闭') except RequestException: raise ScoreException(self.code, '获取成绩信息失败') tip = get_alert_tip(res.text) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, res.text, use_api, score_year, score_term).get_score(score_year, score_term)