建立自己的单词库的原因
主要的睡不着又爱瞎想,脑洞大开就想单词想思维导图一样从逻辑上沾边的都罗列出来,然后就想写一个这样的app或者是网站,但是忘记了我前端的水平还停留在写注册网页上,花里胡哨的还不会,所以就只能先爬一爬词库
词库的需求分析
1.该词库为四级词库
2.该词库应该包括单词的英文、音标、发音、翻译还有词性转换(图片和例句就以后再考虑吧)
使用技术的选择
1.获得单词的相关信息,可以到各大相关的翻译网站,比如有道、谷歌、金山、必应、百度等等等
2.由于python学艺不精,而之前又拿java爬了某图库的相关图片,所以此次爬取还是用java来实现,爬虫上使用WebMagic,数据访问用mybatis,数据落地MySql,项目管理用maven
3.WebMagic基本上可以满足你日常的所有爬虫需要(包括分布式爬取),只是说到爬虫第一时间想到的是Python而不是Java。
技术实现
1. 安装配置maven并导入相应的依赖
Maven教程:http://www.runoob.com/maven/maven-tutorial.html
依赖查询:https://mvnrepository.com/](https://mvnrepository.com/
2. 获取相关单词
首先在度娘上下载四级的所有单词(txt格式的),大概长以下样子:
abandon vt.丢弃;放弃,抛弃
ability n.能力;能耐,本领
abnormal a.不正常的;变态的
aboard ad.在船(车)上;上船
abroad ad.(在)国外;到处
absence n.缺席,不在场;缺乏
absent a.不在场的;缺乏的
absolute a.绝对的;纯粹的
...
接着把这个文档装到数据库中去,代码如下:
BufferedReader bufferedReader;
try {
bufferedReader = new BufferedReader(new FileReader(new File("lexicon.txt")));
String txt = null;
while ((txt = bufferedReader.readLine()) != null) {
txt = txt.trim();
if (!txt.equals("") && txt.length() > 2) {
String wordContent = txt.split(" ")[0];
if (wordContent.matches("[A-Z|a-z]+")) {
wordDao.insertWord(wordContent);
System.out.print(wordContent);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
3.网站分析
下图中的三个框框中的东西就是我想要的
4.代码实现
- 构造url
必应的查询单词的url为:http://cn.bing.com/dict/search?q=单词
- webmagic的工作原理
webmagic
的工作原理是你往里面添加一个url
,启动后会自动去调用process(Page page)
这个方法,所以我们要实现的也就是process(Page page)
上面的逻辑而已
第一次随便 传个url进去,执行if (!page.getUrl().regex(regex).match())
分支下面的代码
//获取所有的单词然后拼接 再添加到page中
List<Word> wordList = wordDao.getWordList();
for (Word word:wordList) {
page.addTargetRequest(url + word.getWordContent());
}
只要page
中还有url
就会重复调用process(Page page)
else
就是当page
的url
符合String regex = "http://cn.bing.com/dict/search.*";
这种格式时就获取里面的东西(获取F12下的HTML文本),然后用xpath去抓取(xpath去网站F12下右键复制就好了)
//抓取代码后存到page包装的map中
page.putField("hd_prUS", page.getHtml().xpath(hd_prUS).regex("(\\[.*?\\])"));
page.putField("hd_prUK", page.getHtml().xpath(hd_prUK).regex("(\\[.*?\\])"));
page.putField("hd_tfUS", page.getHtml().xpath(hd_tfUS).regex("(https\\:.*?mp3)"));
page.putField("hd_tfUK", page.getHtml().xpath(hd_tfUK).regex("(https\\:.*?mp3)"));
page.putField("translate", page.getHtml().xpath(translate).nodes());
page.putField("hd_if", page.getHtml().xpath(hd_if));
其中的hd_prUS
、hd_prUK
什么的主要是根据网站上div
的class
来命名的,不规范可读性差但是懒得改
- 数据落地
String hdprUk = page.getResultItems().get("hd_prUS").toString();
if (hdprUk != null)
word.setUk(hdprUk);
String hdprUS = page.getResultItems().get("hd_prUS").toString();
if (hdprUS != null) {
word.setUs(hdprUS);
wordDao.updateWord(word);
}
String hdtfUS = page.getResultItems().get("hd_tfUS").toString();
if (hdtfUS != null)
downloadMP3(hdtfUS, path + word.getWordContent() + ".us");
String hdtfUK = page.getResultItems().get("hd_tfUK").toString();
if (hdtfUK != null)
downloadMP3(hdtfUK, path + word.getWordContent() + ".uk");
String translate1 = page.getResultItems().get("translate").toString();
if (translate1 != null)
translateSplit(translate1, word.getId());
String hdif = page.getResultItems().get("hd_if").toString();
if (hd_if != null)
convertSplit(hdif, word.getId());
- MP3的下载
//传进取一个音频的url和下载的路径
public void downloadMP3(String strUrl, String path) {
URL url;
InputStream input = null;
OutputStream out = null;
try {
url = new URL(strUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.setRequestMethod("GET");
int code = con.getResponseCode();
System.out.println(code);
input = con.getInputStream();
out = new FileOutputStream(new File(path + ".mp3"));
int i;
while ((i = input.read()) != -1) {
out.write(i);
}
System.out.println("结束");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (input != null) input.close();
if (out != null) out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 翻译下载
//字符串切割后一种翻译是两行的 例如 n. 换行 名词相关的翻译
public void translateSplit(String xml, Integer wordId) {
String[] strs = xml.split(">");
int i = 0;
Translate translate = new Translate();
for (String str : strs) {
if (i % 2 == 0) {
translate = new Translate();
if (str.matches(".+</span")) {
translate.setForm(str.split("<")[0]);
i++;
}
} else {
if (str.matches(".+</span")) {
translate.setContent(str.split("<")[0]);
translate.setWordId(wordId);
translateDao.insertTranslate(translate);
i++;
}
}
}
}
5.结果
-
数据库
单词
翻译
词性转换 -
MP3
发音
网友评论