靠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.网站分析

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


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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,378评论 25 707
  • 刚刚看了tinyfool老师的文章,原来不管中年还是青年,不管初出茅庐,还是社会上的老司机,我们都一样,时...
    咆哮女孩阅读 348评论 0 1
  • 前几天jcx教小麦子学会了把纸对折。今天小麦子的折纸热情高涨。跟着我一起折了一条鱼、一只船、一只兔子。折兔子的时候...
    孙追光阅读 464评论 0 0
  • “大扎好,我是渣渣辉,装备回so没所谓,是兄弟,就来啃我……” 这个广告想必很多人都很熟悉,即使没有玩过这款争议无...
    大俗小雅阅读 672评论 0 1