使用 node 抓取网页图片

node 的使用非常广泛,可以做通信,做爬虫,甚至可以做桌面应用程序。

今天就利用闲暇时间写个小小的分享:利用 node 爬取百度图片首页的图片。

对,就是中间那几张:

图片描述

首先新建一个文件夹,名字随便取,只要不是中文就行,然后在命令行中初始化一下:

npm init -y

新建一个名为 app.js 的文件

在这个文件里,我们需要引入一些模块:

var http=require('http');
var https=require('https')
var fs=require('fs');
var cheerio=require('cheerio');

cheerio 模块是第三方模块,需要进行安装:

npm install cheerio --save

接下来,需要解析百度图片的首页:

var wz='http://images.baidu.com/';
var strHtml='';
http.get(wz,(res)=>{
    res.on('data',(chunk)=>{
        strHtml+=chunk;
    });
    console.log(strHtml)
})

在命令行输入 node app.js 运行,会在命令行看到网页的源代码。这样网页就解析完了。

接下来我们需要获取首页中间的十张图片。

要获取图片,就必须知道图片的 url 地址,在这个网页上,图片的url地址在 img_single_box 下的 img 标签里。

我们之前引用了一个名为 cheerio 的第三方模块,这个库是一个 jQuery 的模块,可以在服务端写 jQuery

在上面的代码示例中,我们已经获取到了网页源代码,接下来就要找到我们需要的 url 地址了:

http.get(wz,(res)=>{
    res.on('data',(chunk)=>{
        ···
    });
    res.on('end',()=>{
        var $=cheerio.load(strHtml);

        //建立一个空数组,用来放我们取得的url地址
        var imgdata=[];
        $('.img_single_box img').each((index,item)=>{
            imgdata.push($(item).attr('src'))
        });
        console.log(imgdata)
    })
})

运行我们写的文件,你将会看到我们需要的url地址已经存进去了。

现在就利用这几个url地址来保存图片了

http.get(wz,(res)=>{
    res.on('data',(chunk)=>{
        ···
    });
    res.on('end',()=>{
        ···
        function saveImage(imgdata){
            https.get(imgdata,(res)=>{
                res.setEncoding('binary');//二进制文件
                var data='';
                res.on('data',(a)=>{
                    data+=a;
                }).on('end',()=>{
                    if(!fs.existsSync('./images')){
                        fs.mkdirSync('./images');
                    };
                    fs.writeFile('images/'+Math.random()+'.png',data,'binary',(err)=>{
                        if(!err)
                        console.log('成功')
                    })
                })
            });
        }
        for(var i=0;i<imgdata.length;i++){
            saveImage(imgdata[i]);
        }
    })
})

到这里就写完了,在命令行 node app.js ,是不是在 images 文件夹下有了10张图片呢?


PureView
440 声望28 粉丝

下一篇 »
Express 介绍