利用PYTHON 爬蟲爬出自己的英語(yǔ)單詞庫(kù)

為什么要建立自己的單詞庫(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)容

  1. 英文:對(duì)應(yīng)英語(yǔ)單詞
  2. 音標(biāo)及讀音:分為美語(yǔ)音標(biāo),讀音珊燎,英語(yǔ)音標(biāo)惭嚣,讀音
  3. 詞性,中文釋義:?jiǎn)卧~多個(gè)含義的不同詞性和中文
  4. 例句:?jiǎn)卧~的例句
  5. 助記:比如詞根或者其他有助于記憶的說(shuō)明
  6. 輸出一個(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í)是要成本的句占。

  1. python+selenium+chrome
    • 可以模擬瀏覽器動(dòng)作沪摄,能有效的解決ajax模式下的數(shù)據(jù)爬取問(wèn)題
    • 很容易實(shí)現(xiàn)基于瀏覽器的測(cè)試
    • 必須能夠趟過(guò) selenium 的一系列坑,相對(duì)學(xué)習(xí)成本要高
  2. 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

  1. 核心代碼分析
  • 構(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()
  1. 整體代碼: 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()
  1. 由于單詞本身不多遗座,而時(shí)間其實(shí)更多舀凛,所以沒(méi)進(jìn)行多線程的改造,按一小時(shí)3600秒途蒋,一秒爬4-5個(gè)單詞猛遍,一小時(shí)也能爬下不少單詞,多線程改造意義不大号坡。

  2. 最后爬1w單詞和對(duì)應(yīng)mp3文件一并發(fā)了吧
    語(yǔ)音(訪問(wèn)碼:1386)
    單詞(訪問(wèn)碼:7678)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懊烤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宽堆,更是在濱河造成了極大的恐慌腌紧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜隶,死亡現(xiàn)場(chǎng)離奇詭異壁肋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)籽慢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門浸遗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人箱亿,你說(shuō)我怎么就攤上這事跛锌。” “怎么了届惋?”我有些...
    開(kāi)封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵髓帽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盼樟,道長(zhǎng)氢卡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任晨缴,我火速辦了婚禮,結(jié)果婚禮上峡捡,老公的妹妹穿的比我還像新娘击碗。我一直安慰自己,他們只是感情好们拙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布稍途。 她就那樣靜靜地躺著,像睡著了一般砚婆。 火紅的嫁衣襯著肌膚如雪械拍。 梳的紋絲不亂的頭發(fā)上突勇,一...
    開(kāi)封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音坷虑,去河邊找鬼甲馋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迄损,可吹牛的內(nèi)容都是我干的定躏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芹敌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痊远!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起氏捞,我...
    開(kāi)封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碧聪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后液茎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逞姿,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年豁护,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哼凯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡楚里,死狀恐怖断部,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情班缎,我是刑警寧澤蝴光,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站达址,受9級(jí)特大地震影響蔑祟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沉唠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一疆虚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧满葛,春花似錦径簿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锄贷,卻和暖如春译蒂,著一層夾襖步出監(jiān)牢的瞬間曼月,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工柔昼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哑芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓岳锁,卻偏偏與公主長(zhǎng)得像绩衷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子激率,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)爬蟲有一段時(shí)間了咳燕,期間接觸了很多相關(guān)的庫(kù),不禁感慨Python就是強(qiáng)大乒躺,當(dāng)你遇到任何問(wèn)題的時(shí)候基本上都有前人造...
    HomerX閱讀 7,804評(píng)論 0 13
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,448評(píng)論 6 428
  • 環(huán)境管理管理Python版本和環(huán)境的工具招盲。p–非常簡(jiǎn)單的交互式python版本管理工具。pyenv–簡(jiǎn)單的Pyth...
    MrHamster閱讀 3,787評(píng)論 1 61
  • 打小嘉冒,每每瞧見(jiàn)父親曹货,他總是問(wèn)我要不要吃咸菜;似乎讳推,只有吃了咸菜顶籽,才有回家的感覺(jué)。 咸菜似乎成了我們父子間最好的交流...
    良曉諾閱讀 1,237評(píng)論 30 49