為什么要建立自己的單詞庫(kù)
用過(guò)各種的背單詞軟件赞警,總是在使用其他人的詞庫(kù)或者軟件自己提供的詞庫(kù),基本是人家提供什么自己就用什么,要想有更多的自主基本沒(méi)有,最近看一個(gè) COCA的按單詞使用頻率來(lái)提取的2萬(wàn)單詞表蔗怠,但沒(méi)有對(duì)應(yīng)的單詞庫(kù),知米里倒是可以直接導(dǎo)入英文單詞吩跋,系統(tǒng)幫你匹配上音標(biāo)寞射、讀音、例句及解釋钞澳,然而匹配后的結(jié)果你卻無(wú)法導(dǎo)出怠惶。
特別是最近準(zhǔn)備利用AnkiDroid來(lái)進(jìn)行單詞背誦,所以有種要建立自己的單詞庫(kù)的需求轧粟。更進(jìn)一步或許可以自己開(kāi)發(fā)一個(gè)背單詞的軟件也是有可能的∨海“萬(wàn)里長(zhǎng)征第一步兰吟,先來(lái)建立單詞庫(kù)”,走一步看一步吧茂翔。
詞庫(kù)的需求分析
根據(jù)需求混蔼,詞庫(kù)應(yīng)該包括如下內(nèi)容
- 英文:對(duì)應(yīng)英語(yǔ)單詞
- 音標(biāo)及讀音:分為美語(yǔ)音標(biāo),讀音珊燎,英語(yǔ)音標(biāo)惭嚣,讀音
- 詞性,中文釋義:?jiǎn)卧~多個(gè)含義的不同詞性和中文
- 例句:?jiǎn)卧~的例句
- 助記:比如詞根或者其他有助于記憶的說(shuō)明
- 輸出一個(gè)文本文件好了悔政,方便以后進(jìn)行各種處理
使用技術(shù)的選擇
獲得單詞的相關(guān)信息晚吞,目前可以通過(guò)百度翻譯,有道翻譯谋国,必應(yīng)翻譯槽地,谷歌翻譯,金山詞霸等方式,在綜合考慮后選擇通過(guò)必應(yīng)字典模式獲得相關(guān)數(shù)據(jù)捌蚊。
數(shù)據(jù)爬取上集畅,目前最為流行的并且相對(duì)成熟的是使用python(也就懂python)则果,所以選擇python
對(duì)于使用python爬取數(shù)據(jù)腌乡,一般有兩種模式,一種是python+urllib+lxml
, python+selenium+chrome
艰山。本身就是一個(gè)小項(xiàng)目窗宦,同時(shí)自身學(xué)習(xí)能力有限就沒(méi)考慮scrapy的爬蟲框架了逃贝。估計(jì)以后要是大量、各種迫摔、經(jīng)常性爬取內(nèi)容才會(huì)考慮這個(gè)沐扳。什么都要學(xué)習(xí)呀,學(xué)習(xí)是要成本的句占。
-
python+selenium+chrome
- 可以模擬瀏覽器動(dòng)作沪摄,能有效的解決ajax模式下的數(shù)據(jù)爬取問(wèn)題
- 很容易實(shí)現(xiàn)基于瀏覽器的測(cè)試
- 必須能夠趟過(guò) selenium 的一系列坑,相對(duì)學(xué)習(xí)成本要高
-
python+urllib+lxml
- 學(xué)習(xí)成本相對(duì)較低
- ajax纱烘,動(dòng)態(tài)網(wǎng)頁(yè)的爬取不方便
當(dāng)然兩者都需要有一定的正則表達(dá)式能力杨拐。由于必應(yīng)字典基本都屬于靜態(tài)網(wǎng)頁(yè),所以選擇方式2就是python+urllib+lxml
模式擂啥。
技術(shù)實(shí)現(xiàn)
1.python及相關(guān)環(huán)境安裝:
使用anaconda 完成整體環(huán)境的安裝哄陶,這里略過(guò),詳細(xì)見(jiàn)http://www.reibang.com/p/f452f71860ab
- 核心代碼分析
- 構(gòu)造url
基本構(gòu)造很簡(jiǎn)單http://cn.bing.com/dict/search?q=單詞
- 獲得頁(yè)面:構(gòu)造一個(gè)函數(shù)哺壶,輸入單詞屋吨,通過(guò)urllib獲得對(duì)應(yīng)頁(yè)面,并返回
def get_page(myword):
basurl='http://cn.bing.com/dict/search?q='
searchurl=basurl+myword
response = urllib.request.urlopen(searchurl)
html = response.read()
return html
- 解析頁(yè)面:主要使用lxml山宾,通過(guò)xpath進(jìn)行內(nèi)容解析至扰,以下以獲得單詞音標(biāo)為例,其他相識(shí)资锰。
def get_yingbiao(html_selector):
yingbiao=[]
yingbiao_xpath='/html/body/div[1]/div/div/div[1]/div[1]/div[1]/div[2]/div' #xpath
bbb="(https\:.*?mp3)" ##這個(gè)是為了獲得對(duì)應(yīng)的讀音MP3文件敢课,使用正則表達(dá)式
reobj1=re.compile(bbb,re.I|re.M|re.S)
get_yingbiao=html_selector.xpath(yingbiao_xpath)
for item in get_yingbiao:
it=item.xpath('div')
if len(it)>0: #處理沒(méi)有讀音或者音標(biāo)的部分
ddd=reobj1.findall(it[1].xpath('a')[0].get('onmouseover',None))
yingbiao.append("%s||%s"%(it[0].text,ddd[0]))
ddd=reobj1.findall(it[3].xpath('a')[0].get('onmouseover',None))
yingbiao.append("%s||%s"%(it[2].text,ddd[0]))
if len(yingbiao)>0: #數(shù)據(jù)整形成一個(gè)字符串,用四個(gè)豎線分隔
return reduce(lambda x, y:"%s||||%s"%(x,y),yingbiao)
else:
return ""
- 多數(shù)據(jù)輸入輸出:輸入文件為一個(gè)英語(yǔ)單詞文件绷杜,每個(gè)單詞一行直秆,輸出為一個(gè)包含單詞,音標(biāo)鞭盟,釋義圾结,例句的文件,同樣每個(gè)單詞一行懊缺。
filename='words.txt' #輸入文件
f=open(filename,"r")
words=f.readlines()
f.close()
filename2='words_jieguo.txt' #輸出文件
f=open(filename2,"w")
i=0
for word in words:
time.sleep(0.25) #怕爬太快給必應(yīng)干掉疫稿,所以歇一會(huì)再來(lái)
print(word.rstrip(),i)
word_line=get_word(word.rstrip()) #獲得單詞相關(guān)內(nèi)容函數(shù)
f.write("%s\n"%(word_line.encode('utf-8'))) #寫入輸出文件
i=i+1
f.close()
- 整體代碼: python3下的實(shí)現(xiàn)培他,在python2下需要進(jìn)行一些微調(diào)。
import urllib.request
from lxml import etree
import re
import time
from functools import reduce
#獲得頁(yè)面數(shù)據(jù)
def get_page(myword):
basurl='http://cn.bing.com/dict/search?q='
searchurl=basurl+myword
response = urllib.request.urlopen(searchurl)
html = response.read()
return html
#獲得單詞釋義
def get_chitiao(html_selector):
chitiao=[]
hanyi_xpath='/html/body/div[1]/div/div/div[1]/div[1]/ul/li'
get_hanyi=html_selector.xpath(hanyi_xpath)
for item in get_hanyi:
it=item.xpath('span')
chitiao.append('%s||%s'%(it[0].text,it[1].xpath('span')[0].text))
if len(chitiao)>0:
return reduce(lambda x, y:"%s||||%s"%(x,y),chitiao)
else:
return ""
#獲得單詞音標(biāo)和讀音連接
def get_yingbiao(html_selector):
yingbiao=[]
yingbiao_xpath='/html/body/div[1]/div/div/div[1]/div[1]/div[1]/div[2]/div'
bbb="(https\:.*?mp3)"
reobj1=re.compile(bbb,re.I|re.M|re.S)
get_yingbiao=html_selector.xpath(yingbiao_xpath)
for item in get_yingbiao:
it=item.xpath('div')
if len(it)>0:
ddd=reobj1.findall(it[1].xpath('a')[0].get('onmouseover',None))
yingbiao.append("%s||%s"%(it[0].text,ddd[0]))
ddd=reobj1.findall(it[3].xpath('a')[0].get('onmouseover',None))
yingbiao.append("%s||%s"%(it[2].text,ddd[0]))
if len(yingbiao)>0:
return reduce(lambda x, y:"%s||||%s"%(x,y),yingbiao)
else:
return ""
#獲得例句
def get_liju(html_selector):
liju=[]
get_liju_e=html_selector.xpath('//*[@class="val_ex"]')
get_liju_cn=html_selector.xpath('//*[@class="bil_ex"]')
get_len=len(get_liju_e)
for i in range(get_len):
liju.append("%s||%s"%(get_liju_e[i].text,get_liju_cn[i].text))
if len(liju)>0:
return reduce(lambda x, y:"%s||||%s"%(x,y),liju)
else:
return ""
def get_word(word):
#獲得頁(yè)面
pagehtml=get_page(word)
selector = etree.HTML(pagehtml.decode('utf-8'))
#單詞釋義
chitiao=get_chitiao(selector)
#單詞音標(biāo)及讀音
yingbiao=get_yingbiao(selector)
#例句
liju=get_liju(selector)
return "%s\t%s\t%s\t%s"%(word,yingbiao,chitiao,liju)
filename='5.txt'
f=open(filename,"r")
words=f.readlines()
f.close()
filename2='5_jieguo.txt'
f=open(filename2,"wb")
i=0
for word in words:
time.sleep(0.2)
print(word.rstrip(),i)
word_line=get_word(word.rstrip())
f.write("%s\n"%(word_line))
i=i+1
f.close()