nodejs的网络爬取

我们有的时候需要一些数据,但是自己去造又比较的麻烦,于是就有了一种解决方案,使用工具去抓取到自己想要的内容。这是一款基于nodejs的抓包工具(Crawler),使用方式还算比较简单,直接看代码吧。
官网任意门:https://www.npmjs.com/package/crawler

  1. 安装:npm i crawler
var Crawler = require("crawler");
 
var c = new Crawler({
    
    
    maxConnections : 10,
    // This will be called for each crawled page
    callback : function (error, res, done) {
    
    
        if(error){
    
    
            console.log(error);
        }else{
    
    
            var $ = res.$;
            console.log($("title").text());
        }
        done();
    }
});
 
// Queue just one URL, with default callback
c.queue('https://www.taobao.com/');

在这里插入图片描述
这段代码是官网的一个案例,直接将淘宝网的标题获取下来了,如果需要抓取自己需要的内容,那么就要自定义抓取规则了。

案例一:将抓取的内容存入到本地

// 1.引入文件
let fs = require('fs')
let path = require('path')
let Crawler = require("crawler");

// 2.定义文件路径
let fileName = path.join(__dirname,'upload',`file-${
      
      new Date().toLocaleDateString()}.txt`)
let data = ''

// 3.创建Crawler对象
let c = new Crawler({
    
    
    maxConnections : 10,
    callback : function (error, res, done) {
    
    
        if(error){
    
    
            console.log(error);
        }else{
    
    
            // 4.定义抓取规则
            let $ = res.$;
            data += $("title").text()
            console.log($("title").text());
            // 5.将抓取到的内容写入文件中
            fs.writeFile(fileName,data,err=>{
    
    
                if(!err){
    
    
                    console.log('写入成功')
                }else{
    
    
                    console.log(err)
                }
            })
        }
        done();
    }
});
 
// Queue just one URL, with default callback
c.queue('https://www.taobao.com/');

在这里插入图片描述
注意:一些比较大型的网站都有可能有做一些反爬取的措施,获取到内容跟实际的内容不一致,或者获取不到想要的内容。
读写一般都是异步代码,如果爬取程序还没有爬取完成,就导致已经将空的内容写进了文件内,那么就没有任何意义了,这个时候我们一般是可以直接将代码写在数据爬取成功的后面,如上文中那么书写,但是如果异步代码很多之后,就会让页面看起来非常的不美观。事实上,官网也提供了对应的解决方案:

crawler.on('drain',function(options){
    
     });

官网提供了三个不同的值:schedule、request、drain,我们可以在不同的时机来做对应的处理,一般在drain中来操作最后的写入或者SQL的写入也是可以在这里操作的,有兴趣的各位可以试试。

// 5.将抓取到的内容写入文件中
c.on('drain',function(options){
    
    
    fs.writeFile(fileName,data,err=>{
    
    
        if(!err){
    
    
            console.log('写入成功')
        }else{
    
    
            console.log(err)
        }
    })
});

最后,官网中还有其他很有意思的操作,比如同时抓取多个地址的数据等,更多的本人也还在探索,希望能够共同学习共同进步吧。

おすすめ

転載: blog.csdn.net/cautionHua/article/details/114823274