nodejs制作爬虫程序

在nodejs中,可以通过不断对服务器进行请求,以及本身的fs  =》filesystem 模块和clientRequest模块对网站的资源进行怕取,目前只做到了对图片的趴取!视频文件格式各异,有的视频网站上视频可能是加密过的。无法爬取来;

'use strict';
const http = require('http');
const fs = require('fs');
const path = require('path');
// 创建一个clientRequest对象
// const cr = http.get('http://www.baidu.com');
// cr.on('response', (res) => {
//     console.log('服务端接受到我的请求了');
//     console.log(res);
// })
// 需要将所有的img标签对应的src属性值提取出来
//再次发起请求,将突破保存在本地的磁盘上面;
//给定一个url,将其下载到本地磁盘;封装一个函数
//不断调用这个函数;使用正则表达式,提取所需要的字符串;
// const cr = http.get('http://www.dbmeinv.com/', (res) => {
//     let str;
//     // 注册data流事件;
//     res.on('data', (chunk) => {
//         str += chunk;
//     });
//     //注册end事件;
//     res.on('end', () => {
//         console.log(str);
//     })
// })
// const cr = http.get('');
// cr.on('response', (res) => {
//     console.log('服务端接受到我的请求了');
//     console.log(res);
//     let data = '';
//     res.on('data',(chunk)=>{
//         data += chunk;
//     });
//     res.on('end',()=>{
//         console.log(data);
//     })
// });

    for(let i =1;i<17;i++) {
        // let num = Math.random()*12000+
        let url ='https://user.qzone.qq.com/812551954';
        // console.log(url);
        down(url);
    }
    function down(url){
        http.get(url,(res)=>{
            let data = '';
            res.on('data',(chunk)=>{
                data += chunk;
            });
            res.on('end',()=>{
                //文件
                let regexp = /src="(http:\/\/[0-9a-zA-Z.\/]+jpg)"/g;
                let arr = [];
                let temp;
                while((temp=regexp.exec(data))!=null){
                    arr.push(temp[1]);
                }
                // console.log(arr);
                arr.forEach((item)=>{
                    download(item);
                })
            })
        });
    }


//用正则表达式去匹配对应的图片资源;

// 首先编写函数下载单张图片
// 目标地址
// 获取目标页面的所有内容; 包括html等;
function download(url) {
    // let url = "http://ww2.sinaimg.cn/large/0060lm7Tgy1fe69ac1v44j30dw0k3gof.jpg"
    //创建一个clientRequest对象,向服务器发送请求;
    http.get(url, (res) => {
        res.setEncoding('binary');
        let data = '';
        //数据开始传输事件;
        res.on('data', (chunk) => {
            data += chunk;
        });
        //数据传输结束的时候,将其接受
        res.on('end', () => {
            let pic = path.basename(url);
            //此时图片的内容已经在data中了;
            //图片存储的路径
            let file = path.join('pic', pic);
            fs.writeFile(file, data, 'binary', (err) => {
                if (err) throw err;
                console.log(`图片${pic}下载成功`);
            })
        })
    })
}

 

posted @ 2017-04-04 00:00  大桥默默学  阅读(160)  评论(0编辑  收藏  举报