成语json_人工智能测试爬百度成语测成语接龙
點(diǎn)擊關(guān)注,我們共同每天進(jìn)步一點(diǎn)點(diǎn)!
前言
本意,昨晚想發(fā)一文,在梳理思路找筆記一小半時(shí),一朋友跟伴侶吵架了,突然從技術(shù)寫(xiě)文轉(zhuǎn)變到情感“磚家”,微信聊了一個(gè)多小時(shí),腦力都用光了,早上開(kāi)會(huì)上傳了一下調(diào)整后的代碼,中午補(bǔ)一下文,完成既定目標(biāo)。
一、起因
去年在測(cè)試公司的人工智能產(chǎn)品中的一功能【成語(yǔ)接龍】,人工語(yǔ)音測(cè)試總玩不過(guò)【琥珀】小姐姐,嘆自身知識(shí)匱乏、小琥珀之刁鉆;
于是乎,網(wǎng)絡(luò)找了幾個(gè)成語(yǔ)數(shù)據(jù)庫(kù),找了幾個(gè)現(xiàn)成的API,弄成自動(dòng)化跑的時(shí),自信滿滿時(shí),【琥珀】卻找出大量的非四字成語(yǔ);
臟數(shù)據(jù)太多,很有挫敗感,于是另謀出路,百度成語(yǔ)相對(duì)靠譜,就你了,本文為很簡(jiǎn)單的測(cè)試,主要看測(cè)試思路。
二、百度成語(yǔ)HTML解析
2.1、瀏覽器打開(kāi)百度成語(yǔ)
https://hanyu.baidu.com/s?wd=成語(yǔ)
2.2、分析HTML與規(guī)律
步驟:1、正常請(qǐng)求--》2、抓包分析--》3、模擬請(qǐng)求--》不成功---》4、抓包對(duì)比分析
所有基本就是循環(huán)以上步驟直至成功為止(反爬另說(shuō),主要是變換請(qǐng)求信息,偽裝不同的用戶請(qǐng)求)。
2.2.1)、正常請(qǐng)求:略
2.2.2)、抓包分析
實(shí)操如下,很容易就找到規(guī)律,圖1圖2一對(duì)比,就可以找到變化的內(nèi)容
請(qǐng)求地址:https://hanyu.baidu.com/hanyu/ajax/search_list?wd=%E6%88%90%E8%AF%AD&from=poem&pn=頁(yè)數(shù)&_=點(diǎn)擊時(shí)間戳說(shuō)明:忽略cookie,實(shí)測(cè)不需要,也沒(méi)有反爬機(jī)制,但本文還是會(huì)保存cookie請(qǐng)求
數(shù)據(jù)標(biāo)簽分析
將抓包的數(shù)據(jù),拷貝,在線Json格式化,可以得到比較好看的結(jié)構(gòu):
json數(shù)據(jù)解析,得知一頁(yè)20個(gè)成語(yǔ),自己所需要信息結(jié)構(gòu)如下:
成語(yǔ):ret_array[x].name
拼音:ret_array[x].pinyin
總頁(yè)數(shù):extra.total-page
2.2.3)、模擬請(qǐng)求
- [工具請(qǐng)求]-初步成功,可以編寫(xiě)腳本了
3、編寫(xiě)腳本(模擬請(qǐng)求)?
??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?#?總頁(yè)數(shù),直接手動(dòng),不去獲取了
?24?page_count?=?1546
?25?
?26?#?組裝請(qǐng)求頭
?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?#?默認(rèn)數(shù)據(jù)庫(kù)
?35?db_filename?=?'idiom.sqlite3'
?36?
?37?
?38?def?get_idiom_data(start_pagenum=1,?end_pagenum=10,?all=False):
?39?????'''
?40???????爬取百度成語(yǔ)數(shù)據(jù),解析并保存到數(shù)據(jù)到數(shù)據(jù)庫(kù)
?41???????:param?start_pagenum:?默認(rèn)從第1頁(yè)開(kāi)始
?42???????:param?end_pagenum:?默認(rèn)第10頁(yè)結(jié)束
?43???????'''
?44?????global?page_count,?header
?45?
?46?????#?統(tǒng)計(jì)成語(yǔ)條數(shù)
?47?????idiom_count?=?0
?48?????#?進(jìn)度條
?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?????#?獲取全部成語(yǔ)
?53?????if?all:
?54?????????end_pagenum?=?page_count
?55?
?56?????for?i?in?range(start_pagenum,?end_pagenum?+?1):
?57?????????#?連接數(shù)據(jù)庫(kù)
?58?????????conn?=?sqlite3.connect(db_filename)
?59?????????cursor?=?conn.cursor()
?60?
?61?????????#?當(dāng)前時(shí)間戳
?62?????????#?t?=?int(round(time.time()?*?1000))
?63?????????#?模擬請(qǐng)求獲取json數(shù)據(jù)
?64?????????try:
?65?????????????#?自動(dòng)保存cookie
?66?????????????s?=?requests.session()
?67?????????????header['Referrer']?=?get_url
?68?
?69?????????????#?百度?ajax?成語(yǔ)請(qǐng)求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?????????????#?模擬請(qǐng)求
?73?????????????result?=?s.get(get_url,?headers=header)
?74?????????????#?判斷請(qǐng)求是否成功
?75?????????????if?result.status_code?==?200:
?76?????????????????res?=?json.loads(result.text)
?77?????????????????page_count?=?res['extra']['total-page']
?78?????????????????#?得到返回的成語(yǔ)
?79?????????????????for?a?in?range(len(res['ret_array'])):
?80?????????????????????txt?=?res['ret_array'][a]
?81?????????????????????#?條數(shù)遞增
?82?????????????????????idiom_count?+=?1
?83?
?84?????????????????????#?目前只需:成語(yǔ)、拼音
?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,成語(yǔ),拼音,成語(yǔ)首字,尾字,首拼,尾拼
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("獲取數(shù)據(jù)失敗:第"+i+"頁(yè)")
110?????????except?requests.exceptions.ConnectTimeout?as?e:
111?????????????print("http請(qǐng)求超時(shí)!"?+?str(e))
112?????????except?socket.timeout?as?e:
113?????????????print("請(qǐng)求超時(shí)!?"?+?str(e))
114?????????except?socket.error?as?e:
115?????????????print("請(qǐng)求錯(cuò)誤!"?+?str(e))
116?????????finally:
117?????????????#?每獲取一頁(yè),保存一次
118?????????????cursor.close()
119?????????????conn.commit()
120?????????????conn.close()
121?????????#?進(jìn)度條
122?????????page_num?+=?1
123?????????view_bar(page_num,?end_pagenum)
124?????print('\n本次爬取[百度成語(yǔ)]?:??第?'?+?str(start_pagenum)?+?'?至?'?+
125???????????str(end_pagenum)?+?'?頁(yè),共計(jì)?'?+?str(idiom_count)?+?'?條')
126?
127?def?view_bar(num,?total):
128?????'''進(jìn)度條'''
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??????如果數(shù)據(jù)庫(kù)不存在,自動(dòng)在當(dāng)前目錄創(chuàng)建idiom.sqlite3:
147?????'''
148?????if?not?os.path.exists(filename):
149?????????conn?=?sqlite3.connect(filename)
150?????????#?創(chuàng)建一個(gè)Cursor:
151?????????cursor?=?conn.cursor()
152?????????#?建表ID?自增長(zhǎng)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?????????#?關(guān)閉Cursor:
157?????????cursor.close()
158?????????#?提交事務(wù):
159?????????conn.commit()
160?????????#?關(guān)閉Connection:
161?????????conn.close()
162?
163?
164?if?__name__?==?'__main__':
165?????#?初始化數(shù)據(jù)庫(kù)
166?????init_db()
167?
168?????#?獲取1-10頁(yè)的數(shù)據(jù),數(shù)據(jù)庫(kù)只會(huì)往里一直加數(shù)據(jù),未做去重,所以以下三個(gè)方式,用最后一種。
169?????#?get_idiom_data()
170?
171?????#?獲取x-x頁(yè)的數(shù)據(jù)
172?????#?get_idiom_data(start_pagenum=10,end_pagenum=30)
173?
174?????#?獲取所有數(shù)據(jù)
175?????get_idiom_data(all=True)
執(zhí)行>?python?get_idiom_from_baidu.py
[====================================================================================================>]?100%
本次爬取[百度成語(yǔ)]?:?第?1?至?1546?頁(yè),共計(jì)?30875?條
源碼:https://github.com/findyou/idiom_from_baidu
4、存在的問(wèn)題
1、本腳本沒(méi)有應(yīng)對(duì)反爬蟲(chóng)機(jī)制(但實(shí)測(cè)不需要)
簡(jiǎn)單方案:請(qǐng)求頭收集一堆,list隨機(jī)取值
完整一點(diǎn):代理IP+請(qǐng)求頭list
2、保存數(shù)據(jù)較少,需要完整的成語(yǔ)數(shù)據(jù)
解析你想要的數(shù)據(jù):第88行 -- 102行間
數(shù)據(jù)庫(kù)增加你想要的字段:第154行 -- 155行
增加要保存的數(shù)據(jù):第106行 -- 107行
3、成語(yǔ)數(shù)據(jù)不全
再爬其他成語(yǔ)庫(kù)補(bǔ)充
4、單線程,速度慢
自已解決一下
三、自動(dòng)化測(cè)試(接口層)
1、成語(yǔ)接龍游戲
正接,即接的成語(yǔ)的前一個(gè)字和問(wèn)的成語(yǔ)的最后一個(gè)字一致(同字或同音都可),目前【琥珀】只支持正接中的尾首同字
2、自動(dòng)化簡(jiǎn)單方案
識(shí)別【琥珀】說(shuō)的成語(yǔ),判斷是否成語(yǔ)
如是成語(yǔ),取其【尾字】,在數(shù)據(jù)庫(kù)中獲取【首字】一樣的成語(yǔ)列表,隨機(jī)給出一個(gè)成語(yǔ)繼續(xù)。
不是成語(yǔ),記錄
3、測(cè)試結(jié)果
正常用例-自動(dòng)測(cè)試結(jié)果:
4、問(wèn)題
1、如何做語(yǔ)音自動(dòng)化方案?
其實(shí)主要測(cè)試邏輯一樣,只需要多解決自動(dòng)化用例TTS播報(bào),被測(cè)的ASR(或文本)獲取。
2、這自動(dòng)化只是一個(gè)簡(jiǎn)單的功能測(cè)試,無(wú)法達(dá)到智能測(cè)試的效果?
對(duì)的,此方案僅覆蓋的是成語(yǔ)的正確性;
趣味性、情感化等回復(fù)的語(yǔ)料,可人工標(biāo)注或者其他方案。
喜歡請(qǐng)關(guān)注,有用請(qǐng)轉(zhuǎn)發(fā)~
升職、加薪、無(wú)漏測(cè)-點(diǎn)“在看”
總結(jié)
以上是生活随笔為你收集整理的成语json_人工智能测试爬百度成语测成语接龙的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java格式_JAVA语言格式
- 下一篇: java http超时重连_httpcl