利用PYTHON 爬蟲爬出自己的英語單詞庫

為什么要建立自己的單詞庫

用過各種的背單詞軟件,總是在使用其他人的詞庫或者軟件自己提供的詞庫,基本是人家提供什么自己就用什么,要想有更多的自主基本沒有,最近看一個 COCA的按單詞使用頻率來提取的2萬單詞表,但沒有對應的單詞庫,知米里倒是可以直接導入英文單詞,系統幫你匹配上音標、讀音、例句及解釋,然而匹配后的結果你卻無法導出。
特別是最近準備利用AnkiDroid來進行單詞背誦,所以有種要建立自己的單詞庫的需求。更進一步或許可以自己開發一個背單詞的軟件也是有可能的。“萬里長征第一步,先來建立單詞庫”,走一步看一步吧。

詞庫的需求分析

根據需求,詞庫應該包括如下內容

  1. 英文:對應英語單詞
  2. 音標及讀音:分為美語音標,讀音,英語音標,讀音
  3. 詞性,中文釋義:單詞多個含義的不同詞性和中文
  4. 例句:單詞的例句
  5. 助記:比如詞根或者其他有助于記憶的說明
  6. 輸出一個文本文件好了,方便以后進行各種處理

使用技術的選擇

獲得單詞的相關信息,目前可以通過百度翻譯,有道翻譯,必應翻譯,谷歌翻譯,金山詞霸等方式,在綜合考慮后選擇通過必應字典模式獲得相關數據。
數據爬取上,目前最為流行的并且相對成熟的是使用python(也就懂python),所以選擇python
對于使用python爬取數據,一般有兩種模式,一種是python+urllib+lxml, python+selenium+chrome。本身就是一個小項目,同時自身學習能力有限就沒考慮scrapy的爬蟲框架了。估計以后要是大量、各種、經常性爬取內容才會考慮這個。什么都要學習呀,學習是要成本的。

  1. python+selenium+chrome
    • 可以模擬瀏覽器動作,能有效的解決ajax模式下的數據爬取問題
    • 很容易實現基于瀏覽器的測試
    • 必須能夠趟過 selenium 的一系列坑,相對學習成本要高
  2. python+urllib+lxml
    • 學習成本相對較低
    • ajax,動態網頁的爬取不方便

當然兩者都需要有一定的正則表達式能力。由于必應字典基本都屬于靜態網頁,所以選擇方式2就是python+urllib+lxml模式。

技術實現

1.python及相關環境安裝:
使用anaconda 完成整體環境的安裝,這里略過,詳細見http://www.lxweimin.com/p/f452f71860ab

  1. 核心代碼分析
  • 構造url
    基本構造很簡單http://cn.bing.com/dict/search?q=單詞
  • 獲得頁面:構造一個函數,輸入單詞,通過urllib獲得對應頁面,并返回
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
  • 解析頁面:主要使用lxml,通過xpath進行內容解析,以下以獲得單詞音標為例,其他相識。
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)"  ##這個是為了獲得對應的讀音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 ""
  • 多數據輸入輸出:輸入文件為一個英語單詞文件,每個單詞一行,輸出為一個包含單詞,音標,釋義,例句的文件,同樣每個單詞一行。
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)  #怕爬太快給必應干掉,所以歇一會再來
    print(word.rstrip(),i)
    word_line=get_word(word.rstrip())  #獲得單詞相關內容函數
    f.write("%s\n"%(word_line.encode('utf-8')))  #寫入輸出文件
    i=i+1
f.close()
  1. 整體代碼: python3下的實現,在python2下需要進行一些微調。
import urllib.request
from lxml import etree
import re 
import time
from functools import reduce

#獲得頁面數據
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 ""

#獲得單詞音標和讀音連接
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):
    #獲得頁面
    pagehtml=get_page(word)
    selector = etree.HTML(pagehtml.decode('utf-8'))
    #單詞釋義
    chitiao=get_chitiao(selector)
    #單詞音標及讀音
    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. 由于單詞本身不多,而時間其實更多,所以沒進行多線程的改造,按一小時3600秒,一秒爬4-5個單詞,一小時也能爬下不少單詞,多線程改造意義不大。

  2. 最后爬1w單詞和對應mp3文件一并發了吧
    語音(訪問碼:1386)
    單詞(訪問碼:7678)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 學習爬蟲有一段時間了,期間接觸了很多相關的庫,不禁感慨Python就是強大,當你遇到任何問題的時候基本上都有前人造...
    HomerX閱讀 7,824評論 0 13
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,537評論 6 427
  • 環境管理管理Python版本和環境的工具。p–非常簡單的交互式python版本管理工具。pyenv–簡單的Pyth...
    MrHamster閱讀 3,823評論 1 61
  • 打小,每每瞧見父親,他總是問我要不要吃咸菜;似乎,只有吃了咸菜,才有回家的感覺。 咸菜似乎成了我們父子間最好的交流...
    良曉諾閱讀 1,273評論 30 49