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

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

本文地址:http://www.cnblogs.com/hustskyking/p/spider-with-node.html,转载请注明源地址。

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

一. 爬虫代码解析


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 一样获取目标内容,不过写正则也挺简单的,比如我们要 获取标题/文章链接/摘要
这些内容,正则表达式为:


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

二. 源码与小结

如果对正则不太熟悉,上面的工作是不太好完成的,很多开发者为 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 = /<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].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 中,先了解下 OPF 格式,然后使用 Amazon 的 KindleGen 工具打包就行啦。

三. 参考资料


NodeJS写个爬虫,把文章放到kindle中阅读,码迷,mamicode.com

时间: 2024-10-13 14:20:04

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

一次使用NodeJS实现网页爬虫记

前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGLE了一番,发现QeePHP框架已经没人维护了.API文档资料都没有了,那可怎么办? 毕竟QeePHP学习成本挺高的.GOOGLE时,我发现已经有人把文档整理好,放在自己的个人网站上了.我在想:万一放文档的个人站点也挂了, 怎么办?还是保存到自己的电脑上比较保险.于是就想着用NodeJS写个爬虫抓取需

nodejs写的一个网页爬虫例子(坏链率)

因为工作需要,用nodejs写了个简单的爬虫例子,之前也没用过nodejs,连搭环境加写大概用了5天左右,so...要多简陋有多简陋,放这里给以后的自己看~~ 整体需求是:给一个有效的URL地址,返回该网页上所有无效链接的百分比(坏链率) 第一个文件:计算环链率 urlSpider.js 1 /*================================================ 2 @author MissUU 3 链接抓取思路: 4 5 1. 获取页面内容 6 2. 正则取得所有

利用Python编写网络爬虫下载文章

#coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期>的一些消息" target="_blank" href="http://blog.sina.com.cn/s/blog_4701280b0102eo83.html"><论电影的七个元素>——关于我对电…</a>' impo

阅读,享受,思考——一个爱书人写给大家的文章

我从初中开始有个不知是好还是坏的习惯,就是非常爱去逛校门外的书店,而且特别爱买课外练习册,什么黄冈密卷,龙门题库,X年真题X年高考,真是买了好多好多,结果当然是绝大部分都是买过之后大部分都没有做过.在高考后的那个暑假整理以前的书时候,看到那么多空白着的练习册,真是心生愧疚啊.可人啊就是秉性难改啊.到了大学,当然不会再买练习册了,我如愿学了我最喜欢的计算机,所以校门外的那家书店我四年里都不知道逛了多少次,买了多少本书,特别是上了大学自己的经济上可以管理每个月的生活费了,而后来知道了当当网更是让我可

零基础写python爬虫之urllib2使用指南

零基础写python爬虫之urllib2使用指南 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用细节. 1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test14来实现一个简单的代理Demo: import urllib2   enable_proxy = True   proxy_handler = urllib2.Prox

手把手教你写网络爬虫(1):网易云音乐歌单

把之前发表在微信公众号的爬虫系列文章迁移过来,热热身,就当备份了. 手把手教你写网络爬虫(1) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好,<手把手教你写网络爬虫>连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意.本文由浅入深的把爬虫技术和盘托出,为初学者提供一种轻松的入门方式.请跟随我们一起踏上爬虫学习的打怪升级之路吧! 介绍 什么是爬虫? 先看看百度百科的定义: 简单的说网络爬虫(Web crawler)也叫做

用Java写的爬虫程序

这是一个web查找的根本程序,从命令行输入查找条件(开端的URL.处置url的最大数.要查找的字符串), 它就会逐一对Internet上的URL进行实时查找,查找并输出匹配查找条件的页面. 这个程序的原型来自<java编程艺术>, 为了非常好的剖析,站长去掉了其间的GUI有些,并稍作修改以适用jdk1.5.以这个程序为基础,可以写出在互联网上查找 比如图像.邮件.页面下载之类的"爬虫". 先请看程序运转的进程: D:\java>javac  SearchCrawler

一个从手机上推送网络文章到kindle的应用a2kindle的制作过程

2015年双11的时候,我买了一个kindle paperwhite 3,阅读体验不错. 当时也想学习手机应用的开发,于是有了从手机上推送文章到kindle的想法,类似稍后阅读功能. 框架是这样的:用户把网页路径,通过手机app,提交到后台服务器,后台服务器根据提交的路径,生成一本电子书,发送到用户的kindle. 过程是比较清晰的,也不想实现太多的功能,比如电子书库,搜索等,这些功能已经有不少软件已经实现了,有的在网页上,有的是在微信公众号. 我为什么选择用app实现,主要是实现起来简单.从用

写网页爬虫遇到标签匹配难题

写网页爬虫遇到标签匹配难题技术 maybe yes 发表于2015-02-02 13:22 原文链接 : http://blog.lmlphp.com/archives/78  来自 : LMLPHP后院 前段时间写优化网页节点的程序时,遇到了标签匹配的难题.在匹配图片标签时,由于标签里面的 JavaScript 代码中含有大于号">"导致无法匹配完整的标签内容.将这样的问题分享出来,不知道像百度啊他们的爬虫是如何处理这样的问题的.请看下面的代码: <!-- HTML DO