靠Java爬了自己的四级词库

建立自己的单词库的原因

主要的睡不着又爱瞎想,脑洞大开就想单词想思维导图一样从逻辑上沾边的都罗列出来,然后就想写一个这样的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.网站分析

下图中的三个框框中的东西就是我想要的


靠Java爬了自己的四级词库_第1张图片

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 wordList = wordDao.getWordList();
            for (Word word:wordList) {
                page.addTargetRequest(url + word.getWordContent());
            }

只要page中还有url就会重复调用process(Page page)
else就是当pageurl符合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_prUShd_prUK什么的主要是根据网站上divclass来命名的,不规范可读性差但是懒得改

  • 数据落地
            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(".+

5.结果

  • 数据库


    靠Java爬了自己的四级词库_第2张图片
    单词

    靠Java爬了自己的四级词库_第3张图片
    翻译

    靠Java爬了自己的四级词库_第4张图片
    词性转换
  • MP3


    靠Java爬了自己的四级词库_第5张图片
    发音

5.参考网站

https://www.jianshu.com/p/8a93198316ed

你可能感兴趣的:(靠Java爬了自己的四级词库)