博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NodeJS写个爬虫,把文章放到kindle中阅读
阅读量:6849 次
发布时间:2019-06-26

本文共 3731 字,大约阅读时间需要 12 分钟。

这两天看了好几篇不错的文章,有的时候想把好的文章 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. 正则提取目标内容

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

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

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

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 下,字体真丑!):

二. 源码与小结

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

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

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

源码没几行:

var http = require("http");var fs = require("fs");var url = "http://www.alloyteam.com/";var data = "";var req = http.request(url, function(res){    res.setEncoding("utf8");    res.on('data', function(chunk){        data += chunk;    });    res.on('end', function(){        dealData(data);    });});req.on('error', function(e){    throw e;});req.end();console.log("数据下载中...");function dealData(data){    var reg = /
\s+
  • \s+
    ]*>.*?<\/a>\s+
    ]*>(.*?)<\/a>[\s\S]*?
    ([\s\S]*?)<\/div>/g; var res = []; while(match = reg.exec(data)) { res.push({ "url": match[1], "title": match[2], "excerpt": match[3].replace(/(<.*?>)((.*?)(<.*?>))?/g, "$3").slice(0,120) }); } writeFile(res) }function writeFile(data){ 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?/g, "\n>") + "\n\n"; } fs.writeFile('index.md', str, function (err) { if (err) throw err; console.log('数据已保存~'); });}
  • 爬虫源码 spider.js

    在 node 环境中:

    node spider.js

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

    三. 参考资料

     

    你可能感兴趣的文章
    log4j的参数配置(转)
    查看>>
    [C++][基础]1_变量、常量和基本类型
    查看>>
    Android Service与Runnable整合并用
    查看>>
    Php综合手册
    查看>>
    [轉]javascript 的 location 各種用法
    查看>>
    MySQL 数据文件 说明
    查看>>
    测地膨胀和膨胀重建—lhMorpRDilate
    查看>>
    30 +最佳移动网络设计灵感的案例
    查看>>
    C++基础代码--20余种数据结构和算法的实现
    查看>>
    深入探索PowerPivot客户端和服务器端架构
    查看>>
    fash 3D 游戏
    查看>>
    Android 用户界面---广播通知(Toast Notifications)
    查看>>
    HDOJ 2090
    查看>>
    Java线程中断的本质和编程原则
    查看>>
    ODBC 、DAO 、ADO 、OLEDB 数据库连接方式区别及联系
    查看>>
    First glance in Go
    查看>>
    24点经典算法
    查看>>
    .net(C#)访问Oracle数据库的几种免安装组件的对比(转)
    查看>>
    Java反射机制<2>
    查看>>
    Centos7网络配置+图形界面设置
    查看>>