NodeJS写个爬虫,把文章放到kindle中阅读

  1. 这两天看了好几篇不错的文章,有的时候想把好的文章 down 下来放到 kindle 上看,便写了个爬虫脚本,因为最近都在搞 node,所以就很自然的选择 node 来爬咯~

    所谓爬虫,可以简单理解为利用程序操作文件,只是这些文件不在本地,需要我们拉取过来。

    一. 爬虫代码解析

    1. 拿到目标页码源码

    Node 提供了很多接口来获取远程地址代码,就拿 AlloyTeam 的页面举例吧,把他首页几篇文章的信息爬取过来。因为 AlloyTeam 使用的协议是 http:// ,本文就不介绍 Node 中 https:// 的使用了。

    var http = require("http");
    
    var url = "http://www.alloyteam.com/";
    var data = "";
    
    // 创建一个请求
    var req = http.request(url, function(res){
        // 设置显示编码
        res.setEncoding("utf8");
        // 数据是 chunked 发送,意思就是一段一段发送过来的
        // 我们使用 data 给他们串接起来
        res.on('data', function(chunk){
            data += chunk;
        });
        // 响应完毕时间出发,输出 data
        res.on('end', function(){
            // dealData(data);
            console.log(data);
        });
    });
    
    // 发送请求
    req.end();

    上面短短七八行代码,就拿到了 AlloyTeam 首页的代码,真的十分简单,如果是 https:// 就得引用 https 模块咯,都是差不多的。

    2. 正则提取目标内容

    先看下我们要抓取的内容:

    img

    由于没有使用其他库,我们没办法像操作 DOM 一样获取目标内容,不过写正则也挺简单的,比如我们要 获取标题/文章链接/摘要 这些内容,正则表达式为:

    // function dealData
    var reg = /<ul\s+class="articlemenu">\s+<li>\s+<a[^>]*>.*?<\/a>\s+<a href="(.*?)"[^>]*>(.*?)<\/a>[\s\S]*?<div\s+class="text">([\s\S]*?)<\/div>/g;
    var res = [];
    while(match = reg.exec(data)) {
        res.push({
            "url": match[1],
            "title": match[2],
            "excerpt": match[3]
        });
    }

    这里的正则看起来有点晦涩,不过呢,正则在编程中十分基础的东西,如果没有太多的了解,建议先去搞清楚,这里就不细说啦。这里要强调的一点是:

    reg.exec(data);

    如果只写上面这句话,只会拿到第一个匹配结果,所以需要使用 while 循环来处理,没处理一次,正则匹配的位置就会往后推一下。其实上面这条语句执行后返回的是一个对象,其中包含一个 index 属性,具体可以查阅 JavaScript 正则的内容。

    这里返回(res)的数据格式是:

    [{
        "url: url,
        "title": title,
        "excerpt" excerpt
    }];

    3. 数据的过滤

    上面虽然拿到了内容,不过我们需要的是纯文本,其他标签什么的得过滤掉,excerpt 中包含了一些标签:

    var excerpt = excerpt.replace(/(<.*?>)((.*?)(<.*?>))?/g, "$3");

    虽说文章中有很多代码,有些标签是不应该删除的,不过这里是摘要内容,这些内容的标签都删除掉,方便我们储存。然后把长度处理下:

    excerpt = excerpt.slice(0, 120);

    4. 存到数据库(或者文件)

    我这里是把文件储存到文件之中,存放格式为:

    [title](url)
    > excerpt

    哈哈,很熟熟悉吧,markdown 语法,看起来也比较清晰。

    var str = "";
    for(var i = 0, len = data.length; i < len; i++){
        str += "[" + data[i].title + "](" + data[i].url + ")\n" + data[i].excerpt.replace("\n\s*\n?", ">\n") + "\n\n";
    }

    先拼接数据,然后写入到文件:

    fs.writeFile('index.md', str, function (err) {
        if (err) throw err;
        console.log('数据已保存~');
    });

    大功告成,过程其实是很简单的。拿到的内容(Linux 下,字体真丑!):

    img

    二. 源码与小结

    如果对正则不太熟悉,上面的工作是不太好完成的,很多开发者为 Node 提供了工具库,使用 npm 可以安装,如果不习惯正则,使用一些工具包辅助处理,可以把拿到的数据当作 DOM 来解析。

    我了解到的有一个叫做 node-jquery 的库貌似还不错,具体请读者自己去网上搜吧,应该挺多的。

    上面的代码都是随手写的,没有做什么容错的机制,也只爬取了首页的内容,不过思路都是一样的,拿到 URL 之后再写个循环,其他页面的内容也就到手了。

    源码没几行:

    img 爬虫源码 spider.js

    在 node 环境中:

    node spider.js

    就可以在同级目录下看到 index.md 文件了。至于如何放到 kindle 中,先了解下 OPF 格式,然后使用 Amazon 的 KindleGen 工具打包就行啦。

    三. 参考资料

全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务