美文网首页
靠Java爬了自己的四级词库

靠Java爬了自己的四级词库

作者: Muramasa_3567 | 来源:发表于2018-11-11 12:47 被阅读0次

    建立自己的单词库的原因

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


      发音

    5.参考网站

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

    相关文章

      网友评论

          本文标题:靠Java爬了自己的四级词库

          本文链接:https://www.haomeiwen.com/subject/dpsxfqtx.html