学习写个Node爬虫
准备工具
node环境,尽量用新点的版本。熟悉的编辑器。
大致步骤
- 分析你要抓取的网站的页面的结构,可以只看你要抓取的部分内容。
- 发起页面请求,(在node中进行)
- 对返回的数据加工处理成自己想要的
开始。
- 新建一个文件夹,在文件件里运行命令行,用yarn init初始化一个项目。初始化时的各种信息可填可不填,无所谓。构建工具可用npm,也可用yarn,看个人喜好。
yarn init
- 安装必要的node库。
superagent(用来发起请求),jquery,jsdom(像Jquery一样处理数据)ps:本来是打算用cheerio的,结果安装的时候404,估计这个包飞了。没办法找的替代方法。
yarn add superagent
yarn add jquery
yarn add jsdom
- 在根目录下新建一个app.js文件。引入我们必要的库。
const superagent = require("superagent");
const jquery = require("jquery");
const jsdom = require("jsdom");
const fs = require("fs");
- 发起请求。比如说简书首页的推荐文章。
先定义请求地址,也可以直接写在请求url里。用superagent发起请求
const reptileUrl = "http://www.jianshu.com/";
superagent.get(reptileUrl).end(function(err, res) {
// 抛错拦截
if (err) {
throw Error(err);
}
const html = res.text;
console.log(html)
此时在命令行里,输入命令 node app.js 这里我们已经看到有大段HTML信息输出,则证明我们是正确的。如有报错请检查一下。
- 接下来处理这段数据,我们先在网站里按F12审查元素看下结构,找到我们需要的这段结构。
接着在代码里处理
superagent.get(reptileUrl).end(function(err, res) {
// 抛错拦截
if (err) {
throw Error(err);
}
const html = res.text;
console.log(html);
dom = new jsdom.JSDOM(html);
const $ = jquery(dom.window);
let data = [];
// 获取数据
$("#list-container .note-list li").each(function(i, item) {
const context = $(item);
data.push({
id: context.attr("data-note-id"), // id
title: replaceText(context.find(".title").text()), // 标题
author: context.find(".meta .nickname").text(), // 作者
info: replaceText(context.find(".abstract").text()), // 预览信息
photo: context.find(".wrap-img img").attr("src"), // 预览图
commentCount: context
.find(".ic-list-comments")
.parent()
.text(),
// 评论次数
likesCount: context
.find(".ic-list-like")
.parent()
.text()
// 点赞次数
});
});
});
上面有一段这个代码,具体参见 https://www.cnblogs.com/weiyinfu/p/10151904.html
const html = res.text;
dom = new jsdom.JSDOM(html);
const $ = jquery(dom.window);
这个方便我们使用jquery对我们抓取到的数据进行处理,如果用cheerio会更简单一些。
抓取到数据之后我们就可以用jq将我们需要的信息从中提取出来,上面我把数据push入了一个已经定义好的数组里。通过打印数组可以发现已经有数据了
- 最后为了方便起见,我们把这段信息输出为一个json文件。文件操作需要用到node自带的fs模块。
fs.writeFile()参数含义可以在网上查看,有很多,如果忘了,用的时候查一下就行,还是很方便的。
fs.writeFile(
__dirname + "/data/article.json",
JSON.stringify({
status: 0,
data: data
}),
function(err) {
if (err) throw err;
console.log("写入完成");
}
);
执行完成之后,我们会在本地目录里发现我们输出的json文件。
--------------------------------END-------------------------