利用PYTHON 爬虫爬出自己的英语单词库

利用PYTHON 爬虫爬出自己的英语单词库* 用过各种的背单词软件,总是在使用其他人的词库或者软件自己提供的词库,基本是人家提供什么自己就用什么,要想有更多的自主基本没有,最近看一个

欢迎大家来到IT世界,在知识的湖畔探索吧!

为什么要建立自己的单词库

  • 用过各种的背单词软件,总是在使用其他人的词库或者软件自己提供的词库,基本是人家提供什么自己就用什么,要想有更多的自主基本没有,最近看一个 COCA的按单词使用频率来提取的2万单词表,但没有对应的单词库,知米里倒是可以直接导入英文单词,系统帮你匹配上音标、读音、例句及解释,然而匹配后的结果你却无法导出。

  • 特别是最近准备利用AnkiDroid来进行单词背诵,所以有种要建立自己的单词库的需求。更进一步或许可以自己开发一个背单词的软件也是有可能的。“万里长征第一步,先来建立单词库”,走一步看一步吧。

词库的需求分析

根据需求,词库应该包括如下内容

  1. 英文:对应英语单词

  2. 音标及读音:分为美语音标,读音,英语音标,读音

  3. 词性,中文释义:单词多个含义的不同词性和中文

  4. 例句:单词的例句

  5. 助记:比如词根或者其他有助于记忆的说明

  6. 输出一个文本文件好了,方便以后进行各种处理

使用技术的选择

  • 获得单词的相关信息,目前可以通过百度翻译,有道翻译,必应翻译,谷歌翻译,金山词霸等方式,在综合考虑后选择通过必应字典模式获得相关数据。

  • 数据爬取上,目前最为流行的并且相对成熟的是使用python(也就懂python),所以选择python

  • 对于使用python爬取数据,一般有两种模式,一种是python+urllib+lxml, 另外一种是python+selenium+chrome。

  • 本身就是一个小项目,同时自身学习能力有限就没考虑scrapy的爬虫框架了。估计以后要是大量、各种、经常性爬取内容才会考虑这个。什么都要学习呀,学习是要成本的。

  • python+selenium+chrome:可以模拟浏览器动作,能有效的解决ajax模式下的数据爬取问题;很容易实现基于浏览器的测试;必须能够趟过 selenium 的一系列坑,相对学习成本要高

  • python+urllib+lxml:学习成本相对较低;ajax,动态网页的爬取不方便

当然两者都需要有一定的正则表达式能力。由于必应字典基本都属于静态网页,所以选择方式2就是python+urllib+lxml模式。

实现

  • python及相关环境安装:使用anaconda 完成整体环境的安装,这里略过,详细见http://www.jianshu.com/p/f452f71860ab

  • 构造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()

  • 整体代码: python3下的实现,在python2下需要进行一些微调。

利用PYTHON 爬虫爬出自己的英语单词库

由于单词本身不多,而时间其实更多,所以没进行多线程的改造,按一小时3600秒,一秒爬4-5个单词,一小时也能爬下不少单词,多线程改造意义不大。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/21865.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信