nodejs爬虫
一提起爬虫可能大家就会觉得很高大上,就会想起python.呵呵,我们今天偏偏就要颠覆大家的认知,用node不到100行代码擼一个简单的爬虫。天天python,我决定换下口味。
开发环境
nodejs
vscode
热下身
Node.js内置的fs模块就是文件系统模块,负责读写文件。
我先用node.js 读写文件 hello,world,新建为index.js
// 加载fs
const fs = require('fs');
// const path = require('path');
// 路径
let filePath = './test.txt';
let writer = fs.createWriteStream(filePath);
writer.write('hello,world\n',err=>{
if(err){
console.log('write error');
}else{
console.log('write success');
}
});
writer.end('bye');
在命令行执行node index.js
文件就写入成功了
搞爬虫
在合适目录下,新建文件夹nodejspdier
打开命令行终端,进入当前目录执行npm init
,初始化package.json
文件
环境安装
npm install cheerio
npm install request
如果安装不了,换源cnpm
在nodejs中npm就是python的pip
cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方
下面代码是对cheerio的介绍
const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')
$('h2.title').text('Hello there!')
$('h2').addClass('welcome')
$.html()
//=> <h2 class="title welcome">Hello there!</h2>
这次爬取的网易云邓紫棋歌手的歌曲的信息
链接:https://music.163.com/artist?id=7763
代码如下
const request = require('request');
// 为服务器特别指定的,快速的实施jquery的核心操作。
const cheerio = require('cheerio');
const path = require('path');
// 文件操作
const fs = require('fs');
var filePath = path.resolve(__dirname, 'data') + '/hotsong.csv';
var writer = fs.createWriteStream(filePath);
// 不是地址栏中的地址,需要在控制面板中查看
// 邓紫棋的热门歌曲
var uri = 'https://music.163.com/artist?id=7763';
request({url : uri,
headers : {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/66.0.3359.181 Safari/537.36'},
method: 'get'},(err, res, body)=>{
if(err){
console.log('爬取失败:\n', err);
}else{
//console.log(res.statusCode, body);
console.log('爬取成功!');
var _$ = cheerio.load(body);
var ul = _$('#song-list-pre-cache').html();
var $ = cheerio.load(ul);
$('li').map(function(){
// song's id
let songId = $(this).find('a').attr('href');
songId = songId.replace('/song?id=', '');
// song's url
let songUrl = 'https://music.163.com/song?id=' + songId;
// song's name
let songName = $(this).find('a').text();
var chunk = songId + ',' + songName + ',' + songUrl + '\n';
console.log(chunk);
// 写入流
writer.write(chunk, err=>{
if(err){
// console.log('error');
console.log('写入出错:\n', err);
}else{
console.log('数据写入成功!');
writer.end();
}
})
})
}
})
执行 node index.js
效果图
用nodejs爬虫的好处就是速度快,python用上多线程下载速度能够比过nodejs,但是解析网页这种事python没有nodejs快,毕竟js原生就是为了写网页。
关注我
坚持原创的公众号
转发,好看支持一下,感谢