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

天天python爬虫,你不腻的吗?_python

文件就写入成功了

天天python爬虫,你不腻的吗?_python_02

搞爬虫

在合适目录下,新建文件夹nodejspdier
打开命令行终端,进入当前目录执行npm init,初始化package.json文件

天天python爬虫,你不腻的吗?_python_03

环境安装

  • 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


天天python爬虫,你不腻的吗?_python_04


代码如下

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

天天python爬虫,你不腻的吗?_python_05效果图

用nodejs爬虫的好处就是速度快,python用上多线程下载速度能够比过nodejs,但是解析网页这种事python没有nodejs快,毕竟js原生就是为了写网页。


天天python爬虫,你不腻的吗?_python_06


关注我


坚持原创的公众号


天天python爬虫,你不腻的吗?_python_07


转发,好看支持一下,感谢

 2019-08-29