nodejs 简易爬虫的实现

nodejs 简单爬虫的实现

  • nodejs
  • cheerio模块
  • request模块

以爬取 https://www.lanrentuku.com/tupian/meishitupian/ 的图片为例

/**
 * nodejs 简单爬虫
 * 
 * 1.请求网站数据
 * 2.数据保存本地  &&  cheerio 类dom化 然后类jq操作
 */
const http = require('https')
const fs = require('fs')
const cheerio = require('cheerio')
// 引入request模块 发送一次请求保存一张图片,也可以用http模块发送请求,这里两种方式都有写到
const request = require('request')

let url = 'https://www.lanrentuku.com/tupian/meishitupian/'
let imgDir='./img/'
let imgType='.jpg'

http.get(url, (res) => {
    // 安全判断
    const { statusCode } = res;
    const contentType = res.headers['content-type'];

    let err = null
    if (statusCode !== 200) {
        err = new Error('请求状态错误')
    } else if (!/^text\/html/.test(contentType)) {
        //格式类型是网页
        err = new Error('请求类型错误')
    }

    if (err) {
        console.log(err)
        res.resume();   //重置缓存
        return false
    }

    fs.mkdir('./img',(err)=>{
        if(err){
            console.log('创建失败,文件已存在')
        }else{
            console.log('创建成功')
        }
    })

    // 数据处理
    // 数据分段 只要接收数据就会触发data事件 chunk为每次接受的数据片段
    let rawData = ''
    res.on('data', (chunk) => {
        rawData += chunk.toString('utf8')
    })
    
    // 数据流传输完毕
    res.on('end', () => {
        // 通过cheerio进行分析
        let $ = cheerio.load(rawData)   // 将网页数据进行转换
        
        // 然后可以通过jq语法进行具体的操作,以该网页为例
        // 选中所有的img元素,遍历然后取出每一个img元素的地址
        $('img').each((index, el) => {
            let src = $(el).attr('src')
            
            // 对请求到的数据进行简单处理,这里给每一张图片加https头
            let arr = !src.match(/http[s]?:\/\/.+\.(jpg|gif|png)/g) ? 'https:' + src : src
			request(arr).pipe(fs.createWriteStream(imgDir + index + imgType));
            // 第二种方式采用http.get() 下载图片
            // http.get(arr, (res) => {
            //     // 一定要修改为二进制编码
            //     res.setEncoding('binary')
            //     let buf=''
            //     res.on('data', (chunk) => {
            //         buf+=chunk
            //     })
            //     res.on('end', () => {
            //         fs.writeFileSync('./img/' + index + '.jpg', buf,'binary',(err)=>{
            //             if(!err) console.log('上传成功')
            //         })
            //         console.log('下载完成')
            //     })
            // })
        })
        // 将请求的数据保存到本地,可以对网站进行具体分析
         fs.writeFileSync('./spilder.html', rawData);
    }).on('error', () => {   			// 绑定一个错误事件
        console.log('请求错误')
    })
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值