【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)
全系列目录:
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)
- 项目的github地址
承接上文。
现在来进行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
time.sleep(3)
【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)的更多相关文章
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw
负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesa ...
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...
- Linux系统启动那些事—基于Linux 3.10内核【转】
转自:https://blog.csdn.net/shichaog/article/details/40218763 Linux系统启动那些事—基于Linux 3.10内核 csdn 我的空间的下载地 ...
- 轻易实现基于linux或win运行的聊天服务端程序
对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过EC这个免费组件你可以非常简单地构建一个基于linux或win部署运行的网络服务程序.这种便利性完全得益于m ...
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
随机推荐
- [Android学习笔记]Android中多线程开发的一些概念
线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ...
- AngularJs打造一个简易权限系统
AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...
- 开启程序的Visual Styles
首先看看MS对Visual Styles的解释: Windows XP and later operating systems support a feature called visual styl ...
- 第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
#include <iostream> #include <stdlib.h> #include <pthread.h> using namespace std; ...
- sql2005,sql2008,sql2012清空日志语句
原文:sql2005,sql2008,sql2012清空日志语句 sql2005清空日志语句 Backup Log DbName WITH no_log GO DUMP TRANSACTION DbN ...
- Extjs 3.4 和 web SSH(Ajaxterm)-howge-ChinaUnix博客
Extjs 3.4 和 web SSH(Ajaxterm)-howge-ChinaUnix博客 Extjs 3.4 和 web SSH(Ajaxterm) 2013-04-07 15:20:17 ...
- 每日算法之三十八:Anagrams
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- Spring整合Jms学习(三)_MessageConverter介绍
1.4 消息转换器MessageConverter MessageConverter的作用主要有双方面,一方面它能够把我们的非标准化Message对象转换成我们的目标Message对象,这主要 ...
- C#的百度地图开发(二)转换JSON数据为相应的类
原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON ...
- Mac下配置Cocos2d-x3.1环境
一.前期准备 1.ADT:百度下就OK 2.NDK:百度下就OK 3.ANT: http://124.254.47.39/download/55152992/78533365/4/zip/57/132 ...