全系列目录:

承接上文。

现在来进行response模块的开发。

这一模块所完成的任务是,如果本地的词库中没有用户需要查询的词汇,那么就去网络上寻找到相应的词条作为结果返回,并存入本地数据库。

我选择的网上的源是iciba,理由很简单,不需要复杂的cookie管理,所查词汇的内容基本集成在返回的html源文件中。

值得注意的是,如果请求过于频繁,那么会被iciba ban掉,所以如果要利用这段代码爬iciba的词库,请自行加个sleep。不过好像我代码中也有,注意改下便是。

该模块的逻辑为:

0、提供一个接口给其他模块调用,输入为待查词汇。

1、构造url请求,获得返回的数据。

2、根据数据的格式,解析返回的数据并获取相应词条的内容

3、按照约定的格式返回相应词条的内容给调用其的其他模块

具体的做法参考源代码

# -*- coding:utf-8 -*-
__author__ = 'wmydx' import urllib
import re
import urllib2
import time class GetResponse: def __init__(self):
self.url = 'http://www.iciba.com/'
self.isEng = re.compile(r'(([a-zA-Z]*)(\s*))*$')
self.group_pos = re.compile(r'<div class="group_pos">(.*?)</div>', re.DOTALL)
self.net_paraphrase = re.compile(r'<div class="net_paraphrase">(.*?)</div>', re.DOTALL)
self.sentence = re.compile(r'<dl class="vDef_list">(.*?)</dl>', re.DOTALL) def process_input(self, word):
word = word.strip()
word = word.replace(' ', '_')
return word def get_data_from_web(self, word):
headers = {'Referer': 'http://www.iciba.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36'}
request = urllib2.Request(self.url + word, headers=headers)
while True:
try:
f = urllib2.urlopen(request).read()
break
except:
pass
return f def get_eng_from_chinese(self, word):
word = self.process_input(word)
word = urllib.quote(word)
data = self.get_data_from_web(word)
label_lst = re.compile(r'<span class="label_list">(.*?)</span>', re.DOTALL)
label_itm = re.compile(r'<label>(?P<item>.*?)</a>(.*?)</label>', re.DOTALL)
first = label_lst.search(data)
data = data[first.start():first.end()]
start_itm = 0
res = []
while 1:
second = label_itm.search(data, start_itm)
if not second:
break
word = self.get_sentence_from_dt(data[second.start('item'):second.end('item')])
res.append(word)
start_itm = second.end()
return res def get_dict_data(self, word):
englst = []
res = []
match = self.isEng.match(word)
if not match:
englst = self.get_eng_from_chinese(word)
else:
englst.append(word)
for item in englst:
word = self.process_input(item)
data = self.get_data_from_web(word)
if data.find('对不起,没有找到') != -1:
res.append(-1)
else:
tmp_dict = self.analysis_eng_data(data)
tmp_dict['word'] = word
tmp_dict['times'] = 1
res.append(tmp_dict)
return res def analysis_eng_data(self, data):
res = {}
explain = self.group_pos.search(data)
if explain:
explain = data[explain.start():explain.end()]
res['explain'] = self.generate_explain(explain)
else:
res['explain'] = -1
net_explain = self.net_paraphrase.search(data)
if net_explain:
net_explain = data[net_explain.start():net_explain.end()]
res['net_explain'] = self.generate_net_explain(net_explain)
else:
res['net_explain'] = -1
sentence_start = 0
sentence_end = len(data)
sentence_lst = []
while sentence_start < sentence_end:
sentence = self.sentence.search(data, sentence_start)
if sentence:
sentence_str = data[sentence.start():sentence.end()]
else:
break
sentence_lst.append(self.generate_sentence(sentence_str))
sentence_start = sentence.end()
res['sentence'] = "\n\n".join(sentence_lst)
return res def generate_explain(self, target):
start_word = 0
end_word = len(target)
meta_word = re.compile(r'<strong class="fl">(?P<meta_word>.*?)</strong>', re.DOTALL)
label_lst = re.compile(r'<span class="label_list">(.*?)</span>', re.DOTALL)
label_itm = re.compile(r'<label>(?P<item>.*?)</label>', re.DOTALL)
res = ''
while start_word < end_word:
first = meta_word.search(target, start_word)
if first:
word_type = target[first.start('meta_word'):first.end('meta_word')]
else:
break
res += word_type + ' '
second = label_lst.search(target, first.end('meta_word'))
start_label = second.start()
end_label = second.end()
while start_label < end_label:
third = label_itm.search(target, start_label)
if third:
res += target[third.start('item'):third.end('item')]
start_label = third.end()
else:
break
res += '\n'
start_word = end_label
return res def generate_net_explain(self, target):
start_itm = 0
end_itm = len(target)
li_item = re.compile(r'<li>(?P<item>.*?)</li>', re.DOTALL)
res = '网络释义: '
while 1:
first = li_item.search(target, start_itm)
if first:
res += target[first.start('item'):first.end('item')]
else:
break
start_itm = first.end()
return res def generate_sentence(self, target):
res = ''
english = re.compile(r'<dt>(?P<eng>.*?)</dt>', re.DOTALL)
chinese = re.compile(r'<dd>(?P<chn>.*?)</dd>', re.DOTALL)
first = english.search(target)
second = chinese.search(target)
res += self.get_sentence_from_dt(target[first.start('eng'):first.end('eng')]) + '\n'
res += target[second.start('chn'):second.end('chn')]
return res def get_sentence_from_dt(self, target):
res = ''
length = len(target)
index = 0
while index < length:
if target[index] == '<':
while target[index] != '>':
index += 1
else:
res += target[index]
index += 1
return res if __name__ == '__main__':
p = GetResponse()
test = ['hello', 'computer', 'nothing', 'bad guy', 'someday']
for item in test:
res = p.get_dict_data(item)
for key in res:
for (k, v) in key.items():
print "dict[%s]=" % k, v
print
time.sleep(3)

【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)的更多相关文章

  1. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  2. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  3. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  4. Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

    负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesa ...

  5. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  6. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)

    最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...

  7. Linux系统启动那些事—基于Linux 3.10内核【转】

    转自:https://blog.csdn.net/shichaog/article/details/40218763 Linux系统启动那些事—基于Linux 3.10内核 csdn 我的空间的下载地 ...

  8. 轻易实现基于linux或win运行的聊天服务端程序

    对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过EC这个免费组件你可以非常简单地构建一个基于linux或win部署运行的网络服务程序.这种便利性完全得益于m ...

  9. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

随机推荐

  1. Android开发经验之—intent传递大数据

    在Activity或者组件之前传递信息时,一般採用intent绑定bundle的方式传值,但在使用过程中须要注意的是不要用bundle传递大容量数据: 在做项目的过程中,须要将听写界面的听写结果信息传 ...

  2. [Android学习笔记]设置Activity方向

    1.设置Activity方向 在AndroidMainfest.xml里设置Activity默认方向 <activity android:name=".myActivity" ...

  3. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET

    基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...

  4. zoj 2822 Sum of Different Primes (01背包)

    ///给你n 求他能分解成多少个的不同的k个素数相加之和 ///01背包,素数打表 # include <stdio.h> # include <algorithm> # in ...

  5. liunx清理磁盘du -h --max-depth=1 /data/*

    liunx清理磁盘du -h --max-depth=1 /data/*

  6. 该项目的建设maven片:4.协调和依赖,spring依赖注入demo

    源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...

  7. Unity3d之MiniJson与LitJson之间的较量

    由于项目不得不用到json来解析服务器端传来的数据,于是不得不选择一种在unity3d上面可用的json.开始根据网上推荐LitJson,于是下载下来源码,导入项目: 经过测试可以用:但是移植到ipa ...

  8. 轻松学习之Linux教程六 正則表達式具体解释

    本系列文章由@超人爱因斯坦出品.转载请注明出处. 作者:超人爱因斯坦    个人站点:http://www.hpw123.net          文章链接:http://hpw123.net/a/L ...

  9. JavaScript模板引擎

    JavaScript模板引擎实例应用   在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及 ...

  10. 7款开源Java反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...