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 #輸出“下次見!”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM