今天CPA出成绩了,有人欢喜有人愁,作为报4考2过1的我来说,简直呵呵。

由于同时查成绩的人太多,官网犹如被DDOS,网页很长时间都加载不出来,我就一直在想能不能绕过网页渲染,直接获取个人的成绩。

然后我还真弄出了个这样的小脚本。

移动端不需要验证码真是帮了大忙。

我太懒了,不想写注释了。

 1import urllib.parse as up
2import hashlib,requests,re,json
3import pandas as pd
4
5login_url = 'http://m.cpaexam.cicpa.org.cn/mobilefordata/loginApp?'
6query_url = 'http://m.cpaexam.cicpa.org.cn/mobilefordata/queryExameeScoreApp?data=%257B%257D'
7headers = {
8    'Host''m.cpaexam.cicpa.org.cn',
9    'Proxy-Connection''keep-alive',
10    'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'
11}
12
13#登录,获取成绩信息
14def query_raw_score():
15    username = input('输入用户名:')
16    idcard = input('输入身份证号:')
17    password = input('输入密码:')
18    password = hashlib.md5(password.encode()).hexdigest()
19    y = {"userName":username,"cardType":"01","cardId":idcard,"password":password}
20    p = up.quote(str(y).replace('\'''\"').replace(' ',''))
21    p = p.replace('%3A',':').replace('%2C',',')
22    params = {
23        'data':p
24    }
25    ses = requests.session()
26    login = ses.get(login_url, headers=headers, params=params)
27    query = ses.get(query_url, headers=headers) 
28    return query
29
30#将JsonP格式的成绩信息转为Json
31def get_score(query):
32    pattern = re.compile('.*?\((.*?)\)')
33    r = re.findall(pattern,query.text)[0]
34    score = json.loads(r)
35    return score
36
37#将成绩信息转为dataframe表格
38def score_frame(score):
39    score_dict = []
40    score_dict.append(('财管',score['value']['scoreCwgl']))
41    score_dict.append(('经济法',score['value']['scoreJjf']))
42    score_dict.append(('税法',score['value']['scoreSf']))
43    score_dict.append(('会计',score['value']['scoreKj']))
44    score_dict.append(('战略',score['value']['scoreQygl']))
45    score_dict.append(('审计',score['value']['scoreSj']))
46    score_frame = pd.DataFrame(score_dict, index=range(1,7), columns=['科目''成绩'])
47    return score_frame
48
49#将个人信息转为dataframe表格
50def info_frame(score):
51    info_dict = []
52    info_dict.append(('年份',score['value']['annual']))
53    info_dict.append(('姓名',score['value']['name']))
54    info_dict.append(('准考证号',score['value']['permitNo']))
55    info_dict.append(('身份证号',score['value']['idCard']))
56    info_frame = pd.DataFrame(info_dict, index=range(1,5))
57    return info_frame
58
59if __name__ == '__main__':
60    query = query_raw_score()
61    score = get_score(query)
62    print('您的个人信息:')
63    print(info_frame(score))
64    print('您当年的成绩:')
65    print(score_frame(score))

效果: