17、 利用扇贝网:https://www.shanbay.com/, 做个测单词的小工具。

先说下,我可以说完全没有看题目要求,我只看了下扇贝网的单词测试工具就开始编码了,写出来的代码尽可能的模仿了网站上的效果。

因为把问题搞复杂了,在这个练习上耽误了很长时间,最后都不想写了,所以代码有些混乱,也没有注释。

后面会把代码重新整理一下,既满足了课程的要求,又包含网站上的那些功能。

 

利用扇贝网:https://www.shanbay.com/, 做个测单词的小工具。
 
扇贝网:https://www.shanbay.com/已经有一个测单词量的功能,
我们要做的就是把这个功能复制下来,并且做点改良,搞一个网页版没有的功能 ———— 自动生成错词本。
 

 

 1 #   扇贝单词量测试分为三个过程
 2 
 3 #   1、选择适合你的出题范围
 4 #   GET https://www.shanbay.com/api/v1/vocabtest/category/
 5 
 6 #   2、获得对应范围的50个单词选择题(含答案)
 7 #   GET https://www.shanbay.com/api/v1/vocabtest/vocabularies/?category=NCEE
 8 
 9 #   3、提交作答结果,系统自动判断词汇量水平
10 #   POST https://www.shanbay.com/api/v1/vocabtest/vocabularies/
11 #   {"category":"NCEE","phase":"","right_ranks":"3,120","word_ranks":"3,120,169,215,303,321,397,447,524,635,691,724,840,868,943,1059,1131,1219,1302,1355,1462,1514,1636,1763,1849,1942,1977,2171,2178,2326,2470,2653,2709,2795,3081,3272,3344,3586,3723,3976,4317,4413,5099,5148,5659,5936,7290,8471,10350,13713"}
12 
13 import requests
14 
15 headers = {
16     'accept-encoding':'gzip, deflate, br' ,
17     'accept-language':'zh-CN,zh;q=0.9' ,
18     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' ,
19     'content-type':'application/json' ,
20     'accept':'*/*' ,
21     'referer':'https://www.shanbay.com/bdc/client/vocabtest/welcome' ,
22     'authority':'www.shanbay.com' ,
23     'cookie':'__utmc=183787513; __utmz=183787513.1555176731.1.1.utmcsr=pypypy.cn|utmccn=(referral)|utmcmd=referral|utmcct=/; locale=zh-cn; _ga=GA1.2.1862606915.1555176731; __utma=183787513.1862606915.1555176731.1555176731.1555264199.2; __utmt=1; __utmb=183787513.1.10.1555264199; _gat=1' ,
24     'x-csrftoken':'null'
25 }
26 
27 res1 = requests.get('https://www.shanbay.com/api/v1/vocabtest/category/',headers=headers)
28 step1 = res1.json()
29 items = step1['data']
30 categorys = []
31 print('第一步:请选择出题范围:')
32 for item in items:
33     categorys.append(item[0])
34     print('\t选择  {}  请输入代码  {}'.format(item[1],item[0]))
35 category = input('请输输入出题范围代码:')
36 if category not in categorys:
37     category = 'NONE'
38 
39 res2 = requests.get('https://www.shanbay.com/api/v1/vocabtest/vocabularies/?category={}'.format(category),headers=headers)
40 step2 = res2.json()
41 items = step2['data']
42 print('\n请选择你认识的单词:\n')
43 for item in items:
44     for i in range(5,50,5):
45         if items.index(item) == i:
46             print('\n')
47     print('%-20s' %(item['content']),end='')
48 select_all_words = input('\n\n以上单词你都认识吗?(Y/n)')
49 
50 select_words = []
51 word_ranks = []
52 for item in items:
53     word_ranks.append(str(item['rank']))
54 if select_all_words != 'n':
55     select_words = items
56 else:
57     for item in items:
58         know = input('你认识单词 {} 吗?(Y/n)'.format(item['content']))
59         if know != 'n':
60             select_words.append(item['content'])
61 
62 choices =['A','B','C','D','E']
63 right_ranks = []
64 for item in select_words:
65     print('\n请选择单词 {} 的正确意思\n'.format(item['content']))
66     item_choices = item['definition_choices']
67     for i in range(4):
68         print('\t'+choices[i]+item_choices[i]['definition'])
69     print('\tE  我不认识\n')
70     my_choice = input('你的选择是?(A/B/C/D/E)')
71     try:
72         if item_choices[choices.index(my_choice)]['rank'] == item['rank']:
73             right_ranks.append(str(item['rank']))
74     except:
75         pass
76 
77 res3_post = {}
78 res3_post['category'] = category
79 res3_post['phase'] = ''
80 res3_post['right_ranks'] = ','.join(right_ranks)
81 res3_post['word_ranks'] = ','.join(word_ranks)
82 
83 res3 = requests.post('https://www.shanbay.com/api/v1/vocabtest/vocabularies/',json=res3_post)
84 result = res3.json()
85 print('您的词汇量大约是 {} ,{}'.format(result['data']['vocab'],result['data']['comment']))

 

 

执行结果:
 1 第一步:请选择出题范围:
 2         选择  GMAT  请输入代码  GMAT
 3         选择  考研  请输入代码  NGEE
 4         选择  高考  请输入代码  NCEE
 5         选择  四级  请输入代码  CET4
 6         选择  六级  请输入代码  CET6
 7         选择  英专  请输入代码  TEM
 8         选择  托福  请输入代码  TOEFL
 9         选择  GRE  请输入代码  GRE
10         选择  雅思  请输入代码  IELTS
11         选择  任意  请输入代码  NONE
12 请输输入出题范围代码:NCEE
13 
14 请选择你认识的单词:
15 
16 work                country             game                history             effort
17 
18 society             cause               subject             dead                laugh
19 
20 adult               mouth               access              hide                river
21 
22 review              train               importance          obvious             equal
23 
24 reference           spiritual           tale                nervous             junior
25 
26 broken              guarantee           plot                tennis              chef
27 
28 sculpture           towel               apologize           dawn                biology
29 
30 frontier            homework            atom                slim                salesman
31 
32 toast               wrestle             cabbage             sleepy              abnormal
33 
34 Buddhist            liter               porter              rewind
35 
36 以上单词你都认识吗?(Y/n)
37 
38 请选择单词 work 的正确意思
39 
40         A n. 妇女, 女人
41         B n. 工作,作用,成果,作品,善行,工艺,奏效,建筑工程,工厂,(机械)活动部件
42         C adj. 迟的,晚的,已故的
43         D adj. 广泛的,大的,强烈的
44         E  我不认识
45 
46 你的选择是?(A/B/C/D/E)A
47 
48 中间省略48个单词测试
49 
50 请选择单词 rewind 的正确意思
51 
52         A n. 乖僻,倔强,刚愎
53         B n. 低声唱歌的人或歌手
54         C vt.回绕, 倒带
55         D adj. 内成的
56         E  我不认识
57 
58 你的选择是?(A/B/C/D/E)A
59 您的词汇量大约是 1200 ,朋友,英语基础还不是很牢啊,要好好努力!

 

老师的代码
 1 import requests
 2 
 3 link = requests.get('https://www.shanbay.com/api/v1/vocabtest/category/')
 4 #先用requests下载链接。
 5 js_link = link.json()
 6 #解析下载得到的内容。
 7 bianhao = int(input('''请输入你选择的词库编号,按Enter确认
 8 1,GMAT  2,考研  3,高考  4,四级  5,六级
 9 6,英专  7,托福  8,GRE  9,雅思  10,任意
10 >'''))
11 #让用户选择自己想测的词库,输入数字编号。int()来转换数据类型
12 ciku = js_link['data'][bianhao-1][0]
13 #利用用户输入的数字编号,获取题库的代码。如果以输入“高考”的编号“3”为例,那么ciku的值就是,在字典js_link中查找data的值,data是一个list,查找它的第bianhao-1,也就是第2个元素,得到的依然是一个list,再查找该list的第0个元素。最后得到的就是我们想要的NCEE。
14 test = requests.get('https://www.shanbay.com/api/v1/vocabtest/vocabularies/?category='+ciku)
15 #下载用于测试的50个单词。
16 words = test.json()
17 #对test进行解析。
18 danci = []
19 #新增一个list,用于统计用户认识的单词
20 words_knows = []
21 #创建一个空的列表,用于记录用户认识的单词。
22 not_knows = []
23 #创建一个空的列表,用于记录用户不认识的单词。
24 print ('测试现在开始。如果你认识这个单词,请输入Y,否则直接敲Enter:')
25 n=0
26 for x in words['data']:
27 #启动一个循环,循环的次数等于单词的数量。
28     n=n+1
29     print ("\n第"+str(n)+'个:'+x['content'])
30 #加一个\n,用于换行。
31 answer = input('认识请敲Y,否则敲Enter:')
32 #让用户输入自己是否认识。
33 if answer == 'Y':
34 #如果用户认识:
35     danci.append(x['content'])
36     words_knows.append(x)
37     #就把这个单词,追加进列表words_knows。
38 else:
39 #否则
40     not_knows.append(x)
41     #就把这个单词,追加进列表not_knows。print ('\n在上述'+str(len(words['data']))+'个单词当中,有'+str(len(danci))+'个是你觉得自己认识的,它们是:')
42 print(danci)
43 print ('现在我们来检测一下,你有没有真正掌握它们:')
44 wrong_words = []
45 right_num = 0
46 for y in words_knows:
47     print('\n\n'+'A:'+y['definition_choices'][0]['definition'])
48 #我们改用A、B、C、D,不再用rank值,下同
49 print('B:'+y['definition_choices'][1]['definition'])
50 print('C:'+y['definition_choices'][2]['definition'])
51 print('D:'+y['definition_choices'][3]['definition'])
52 xuanze = input('请选择单词\"'+y['content']+'\"的正确翻译(填写数字即可):')
53 dic = {'A':y['definition_choices'][0]['rank'],'B':y['definition_choices'][1]['rank'],'C':y['definition_choices'][2]['rank'],'D':y['definition_choices'][3]['rank']}
54 #我们创建一个字典,搭建起A、B、C、D和四个rank值的映射关系。
55 if dic[xuanze] == y['rank']:
56 #此时dic[xuanze]的内容,其实就是rank值,此时的代码含义已经和之前的版本相同了。
57     right_num += 1
58 else:
59     wrong_words.append(y)print ('现在,到了公布成绩的时刻:')
60 print (''+str(len(words['data']))+''+js_link['data'][bianhao-1][1]+'词汇当中,你认识其中'+str(len(danci))+'个,实际掌握'+str(right_num)+'个,错误'+str(len(wrong_words))+'个。')
61 #这是句蛮复杂的话,对照前面的代码和json文件你才能理解它。一个运行示例是:在50个高考词汇当中,你认识其中30个,实际掌握25个,错误5个。
62 save = input ('是否打印并保存你的错词集?填入Y或N: ')
63 #询问用户,是否要打印并保存错题集。
64 if save == 'Y':
65 #如果用户说是:
66     f = open('错题集.txt', 'a+')
67 #在当前目录下,创建一个错题集.txt的文档。        
68 print ('你记错的单词有:')
69 f.write('你记错的单词有:\n')
70 #写入"你记错的单词有:\n"
71 m=0
72 for z in wrong_words:
73 #启动一个循环,循环的次数等于,用户的错词数:
74     m=m+1
75     print (z['content'])
76     #打印每一个错词。
77     f.write(str(m+1) +'. '+ z['content']+'\n')
78     #写入序号,写入错词。           
79 print ('你不认识的单词有:')
80 f.write('你没记住的单词有:\n')
81 #写入"你没记住的单词有:\n"
82 s=0
83 for x in not_knows:
84 #启动一个循环,循环的次数等于,用户不认识的单词数。
85     print (x['content'])
86     #打印每一个不认识的单词。
87     f.write(str(s+1) +'. '+ x['content']+'\n')
88     #写入序号,写入用户不认识的词汇。
89 print ('错词和没记住的词已保存至当前文件目录下,下次见!')
90 #告诉用户,文件已经保存好。
91 #在网页版终端运行时,文件会被写在课程的服务器上,你看不到,但它的确已经存在。else:
92 #如果用户不想保存:
93     print('下次见!')
94 #输出“下次见!”

 

posted @ 2019-04-16 22:51  三角形  阅读(3552)  评论(0编辑  收藏  举报