node篇 <菜鸟进阶一> node.js 实现简单爬虫,爬取 ‘’去哪了‘’ 首页图片

872 阅读1分钟

爬虫案例

  • 爬虫案例分析 <主要步骤>
    1. 获取目标网站 需要被扒网页的数据
    2. 分析网站内容(cheerio)
    3. 获取有效信息 下载或者其他操作
  • 直接上代码
    1. 引入模块主模块
    2. 安装 cheerio 第三方模块,可以使用jQ语法,进行html标签过滤
    3. 获取去哪了首页网址全部内容 首页内容多,分批爬取进,行拼接
    4. 使用cheerio,获取img 对应的属性 src
    5. 根据src 内容,进行重新爬取,再保存到目录文件夹
// 先引入需要的模块 http,https,fs,cheerio

// 提前下载依赖,可以使用jQ 选择器获取内容
// npm i cheerio

const http = require('http');
const https = require('https');
const fs = require('fs');
const cheerio = require('cheerio')
const nodeUrl = 'http://hotel.qunar.com/?kwid=47392517&cooperate=baidu'; 

http.get(nodeUrl,(res)=>{

// 进行请求的校验,查看返回码及类型是否ok**********************************
    const {statusCode} = res;
    const contentType = res.headers['content-type'];
    console.log(statusCode,contentType);
    let err = null;

    if(statusCode !== 200){
        err = new Error('请求状态码错误');
    }else if( !/^text\/html/.test(contentType) ){
        err = new Error('请求类型错误');
    }
    if(err){
        console.log(`当前请求 Error:  + ${err}`);
        res.resume();  //清除缓存
        return false;
    }
// 获取到的内容操作************************************************
    let rowData = ''
    res.on('data', (chunk)=>{
        rowData += chunk;
        // console.log('数据传输OK');
    });
    res.on('err', (err)=>{
        console.log('数据传输有误:' + err);
    });
    res.on('end', ()=>{
    	// 保存单文件**************************************
        // fs.writeFile('./qunale.html', rowData,(err)=>{
        //     if(err){
        //         console.log('err: ' + err);
        //     }else{
        //         console.log('写入成功')
        //     }
        // })
        
        let $ = cheerio.load(rowData);

        // rowData  爬取到内容处理   单个文件爬取
        // let arr =  $('img').attr('src');
        // console.log(arr);
        // https.get(arr,(response)=>{
        //     var imgData = "";
        //     response.setEncoding("binary");
        //     response.on("data", function(chunk){
        //         imgData += chunk;
        //     });
        //     response.on("end", function(){
        //         fs.writeFile("./Image/age.jpg", imgData, "binary", function(err){
        //             if(err){
        //                 console.log("down fail:" + err);
        //             }else{
        //                 console.log("down success");
        //             }
        //         });
        //     });
        // })

        //爬取到内容处理   多个文件爬取******************************
        $('img').each( (index, el)=>{
            console.log($(el).attr('src'));
            // 下载爬取内容图片
            let str = $(el).attr('src');
            if( !str.startsWith('https') ){
                str = 'https:' + str;
            }

                https.get(str,(response)=>{

                    var imgData = "";
                    response.setEncoding("binary"); //一定要设置response的编码为binary否则会下载下来的图片打不开
                    response.on("data", function(chunk){
                        imgData += chunk;
                    });
                
                    response.on("end", function(){

                        fs.writeFile(`./Image/age${index}.jpg`, imgData, "binary", function(err){
                            if(err){
                                console.log("down fail:" + err);
                            }else{
                                console.log("down success");
                            }
                        });
                    });

                    
                })
        })
        
        console.log('数据传输完成:');
    })
}).on('error', (error)=>{
    console.log(error);
})

图片爬取结果