成语json_人工智能测试爬百度成语测成语接龙
點擊關注,我們共同每天進步一點點!
前言
本意,昨晚想發一文,在梳理思路找筆記一小半時,一朋友跟伴侶吵架了,突然從技術寫文轉變到情感“磚家”,微信聊了一個多小時,腦力都用光了,早上開會上傳了一下調整后的代碼,中午補一下文,完成既定目標。
一、起因
去年在測試公司的人工智能產品中的一功能【成語接龍】,人工語音測試總玩不過【琥珀】小姐姐,嘆自身知識匱乏、小琥珀之刁鉆;
于是乎,網絡找了幾個成語數據庫,找了幾個現成的API,弄成自動化跑的時,自信滿滿時,【琥珀】卻找出大量的非四字成語;
臟數據太多,很有挫敗感,于是另謀出路,百度成語相對靠譜,就你了,本文為很簡單的測試,主要看測試思路。
二、百度成語HTML解析
2.1、瀏覽器打開百度成語
https://hanyu.baidu.com/s?wd=成語
2.2、分析HTML與規律
步驟:1、正常請求--》2、抓包分析--》3、模擬請求--》不成功---》4、抓包對比分析
所有基本就是循環以上步驟直至成功為止(反爬另說,主要是變換請求信息,偽裝不同的用戶請求)。
2.2.1)、正常請求:略
2.2.2)、抓包分析
實操如下,很容易就找到規律,圖1圖2一對比,就可以找到變化的內容
請求地址:https://hanyu.baidu.com/hanyu/ajax/search_list?wd=%E6%88%90%E8%AF%AD&from=poem&pn=頁數&_=點擊時間戳說明:忽略cookie,實測不需要,也沒有反爬機制,但本文還是會保存cookie請求
數據標簽分析
將抓包的數據,拷貝,在線Json格式化,可以得到比較好看的結構:
json數據解析,得知一頁20個成語,自己所需要信息結構如下:
成語:ret_array[x].name
拼音:ret_array[x].pinyin
總頁數:extra.total-page
2.2.3)、模擬請求
- [工具請求]-初步成功,可以編寫腳本了
3、編寫腳本(模擬請求)?
??1?#?-*-?coding:?utf-8?-*-??2?"""
??3?@author:?findyou
??4?@contact:?albert.peng@foxmail.com
??5?@version:?1.0
??6?@license:?Apache?Licence
??7?@file:?get_idiom_from_baidu.py
??8?@time:?2018/10/21?20:35
??9?"""
?10?
?11?__author__?=?'albert'
?12?__version__?=?'1.0'
?13?
?14?import?json
?15?import?sqlite3
?16?
?17?import?os
?18?import?requests
?19?import?socket
?20?import?time
?21?import?sys
?22?
?23?#?總頁數,直接手動,不去獲取了
?24?page_count?=?1546
?25?
?26?#?組裝請求頭
?27?header?=?{
?28?????'Accept':?'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
?29?????'Accept-Encoding':?'gzip,?deflate,?sdch',
?30?????'Accept-Language':?'zh-CN,zh;q=0.9',
?31?????'Connection':?'keep-alive',
?32?????'User-Agent':?'Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_14_0)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/70.0.3538.67?Safari/537.36'
?33?}
?34?#?默認數據庫
?35?db_filename?=?'idiom.sqlite3'
?36?
?37?
?38?def?get_idiom_data(start_pagenum=1,?end_pagenum=10,?all=False):
?39?????'''
?40???????爬取百度成語數據,解析并保存到數據到數據庫
?41???????:param?start_pagenum:?默認從第1頁開始
?42???????:param?end_pagenum:?默認第10頁結束
?43???????'''
?44?????global?page_count,?header
?45?
?46?????#?統計成語條數
?47?????idiom_count?=?0
?48?????#?進度條
?49?????page_num?=?0
?50?????get_url?=?'https://hanyu.baidu.com/hanyu/ajax/search_list?wd=%E6%88%90%E8%AF%AD&from=poem&pn={}&_={}'.format(1,?int(round(time.time()?*?1000)))
?51?
?52?????#?獲取全部成語
?53?????if?all:
?54?????????end_pagenum?=?page_count
?55?
?56?????for?i?in?range(start_pagenum,?end_pagenum?+?1):
?57?????????#?連接數據庫
?58?????????conn?=?sqlite3.connect(db_filename)
?59?????????cursor?=?conn.cursor()
?60?
?61?????????#?當前時間戳
?62?????????#?t?=?int(round(time.time()?*?1000))
?63?????????#?模擬請求獲取json數據
?64?????????try:
?65?????????????#?自動保存cookie
?66?????????????s?=?requests.session()
?67?????????????header['Referrer']?=?get_url
?68?
?69?????????????#?百度?ajax?成語請求API
?70?????????????get_url?=?'https://hanyu.baidu.com/hanyu/ajax/search_list?wd=%E6%88%90%E8%AF%AD&from=poem&pn={}&_={}'.format(i,?int(round(time.time()?*?1000)))
?71?
?72?????????????#?模擬請求
?73?????????????result?=?s.get(get_url,?headers=header)
?74?????????????#?判斷請求是否成功
?75?????????????if?result.status_code?==?200:
?76?????????????????res?=?json.loads(result.text)
?77?????????????????page_count?=?res['extra']['total-page']
?78?????????????????#?得到返回的成語
?79?????????????????for?a?in?range(len(res['ret_array'])):
?80?????????????????????txt?=?res['ret_array'][a]
?81?????????????????????#?條數遞增
?82?????????????????????idiom_count?+=?1
?83?
?84?????????????????????#?目前只需:成語、拼音
?85?????????????????????name?=?(get_vaule(txt,?'name'))[0].strip()
?86?????????????????????pinyin?=?(get_vaule(txt,?'pinyin'))[0].strip()
?87?????????????????????pinyin_list?=?pinyin.split("?")
?88?
?89?????????????????????#?例句
?90?????????????????????#?liju?=?get_vaule(txt,?'liju')[0]
?91?????????????????????#?出處
?92?????????????????????#?tmp?=?get_vaule(txt,?'source')[0]
?93?????????????????????#?if?len(tmp)?>?0:
?94?????????????????????#?????source?=?tmp.replace('"',?'').replace("'",?"").replace('\n',?'')
?95?????????????????????#?else:
?96?????????????????????#?????source?=?''
?97?????????????????????#?同義詞
?98?????????????????????#?get_vaule(txt,?'synonym')
?99?????????????????????#?tmp?=?get_vaule(txt,?'term_synonym')
100?????????????????????#?if?len(tmp)?>?0:
101?????????????????????#?????synonym?=?tmp
102?????????????????????#?else:
103?
104?????????????????????#?ID,成語,拼音,成語首字,尾字,首拼,尾拼
105?????????????????????cursor.execute(
106?????????????????????????'insert?into?IDIOM?(ID,NAME,PINYIN,NAMEF,NAMEL,PINYINF,PINYINL)?values?(NULL,"%s","%s","%s","%s","%s","%s")'?%
107?????????????????????????(name,?pinyin,?name[0],?name[len(name)?-?1],?pinyin_list[0],?pinyin_list[len(pinyin_list)?-?1]))
108?????????????else:
109?????????????????print("獲取數據失敗:第"+i+"頁")
110?????????except?requests.exceptions.ConnectTimeout?as?e:
111?????????????print("http請求超時!"?+?str(e))
112?????????except?socket.timeout?as?e:
113?????????????print("請求超時!?"?+?str(e))
114?????????except?socket.error?as?e:
115?????????????print("請求錯誤!"?+?str(e))
116?????????finally:
117?????????????#?每獲取一頁,保存一次
118?????????????cursor.close()
119?????????????conn.commit()
120?????????????conn.close()
121?????????#?進度條
122?????????page_num?+=?1
123?????????view_bar(page_num,?end_pagenum)
124?????print('\n本次爬取[百度成語]?:??第?'?+?str(start_pagenum)?+?'?至?'?+
125???????????str(end_pagenum)?+?'?頁,共計?'?+?str(idiom_count)?+?'?條')
126?
127?def?view_bar(num,?total):
128?????'''進度條'''
129?????rate?=?num?/?total
130?????rate_num?=?int(rate?*?100)
131?????#?r?=?'\r?%d%%'?%(rate_num)
132?????r?=?'\r[%s>]?%d%%'?%?('='?*?rate_num,?rate_num)
133?????sys.stdout.write(r)
134?????sys.stdout.flush
135?
136?
137?def?get_vaule(idiom_dict,?key_vaule):
138?????if?key_vaule?in?idiom_dict.keys():
139?????????return?idiom_dict[key_vaule]
140?????else:
141?????????return?['?']
142?
143?
144?def?init_db(filename=db_filename):
145?????'''
146??????如果數據庫不存在,自動在當前目錄創建idiom.sqlite3:
147?????'''
148?????if?not?os.path.exists(filename):
149?????????conn?=?sqlite3.connect(filename)
150?????????#?創建一個Cursor:
151?????????cursor?=?conn.cursor()
152?????????#?建表ID?自增長key
153?????????cursor.execute(
154?????????????'CREATE?TABLE?IDIOM?(ID?INTEGER?PRIMARY?KEY?AUTOINCREMENT,?NAME?VARCHAR(100),NAMEF?VARCHAR(10),NAMEL?VARCHAR(10),\
155???????????????PINYIN?VARCHAR(100),PINYINF?VARCHAR(10),PINYINL?VARCHAR(10))')
156?????????#?關閉Cursor:
157?????????cursor.close()
158?????????#?提交事務:
159?????????conn.commit()
160?????????#?關閉Connection:
161?????????conn.close()
162?
163?
164?if?__name__?==?'__main__':
165?????#?初始化數據庫
166?????init_db()
167?
168?????#?獲取1-10頁的數據,數據庫只會往里一直加數據,未做去重,所以以下三個方式,用最后一種。
169?????#?get_idiom_data()
170?
171?????#?獲取x-x頁的數據
172?????#?get_idiom_data(start_pagenum=10,end_pagenum=30)
173?
174?????#?獲取所有數據
175?????get_idiom_data(all=True)
執行>?python?get_idiom_from_baidu.py
[====================================================================================================>]?100%
本次爬取[百度成語]?:?第?1?至?1546?頁,共計?30875?條
源碼:https://github.com/findyou/idiom_from_baidu
4、存在的問題
1、本腳本沒有應對反爬蟲機制(但實測不需要)
簡單方案:請求頭收集一堆,list隨機取值
完整一點:代理IP+請求頭list
2、保存數據較少,需要完整的成語數據
解析你想要的數據:第88行 -- 102行間
數據庫增加你想要的字段:第154行 -- 155行
增加要保存的數據:第106行 -- 107行
3、成語數據不全
再爬其他成語庫補充
4、單線程,速度慢
自已解決一下
三、自動化測試(接口層)
1、成語接龍游戲
正接,即接的成語的前一個字和問的成語的最后一個字一致(同字或同音都可),目前【琥珀】只支持正接中的尾首同字
2、自動化簡單方案
識別【琥珀】說的成語,判斷是否成語
如是成語,取其【尾字】,在數據庫中獲取【首字】一樣的成語列表,隨機給出一個成語繼續。
不是成語,記錄
3、測試結果
正常用例-自動測試結果:
4、問題
1、如何做語音自動化方案?
其實主要測試邏輯一樣,只需要多解決自動化用例TTS播報,被測的ASR(或文本)獲取。
2、這自動化只是一個簡單的功能測試,無法達到智能測試的效果?
對的,此方案僅覆蓋的是成語的正確性;
趣味性、情感化等回復的語料,可人工標注或者其他方案。
喜歡請關注,有用請轉發~
升職、加薪、無漏測-點“在看”
總結
以上是生活随笔為你收集整理的成语json_人工智能测试爬百度成语测成语接龙的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java格式_JAVA语言格式
- 下一篇: java http超时重连_httpcl