美文网首页
09.node简易爬虫

09.node简易爬虫

作者: 讲武德的年轻人 | 来源:发表于2019-09-25 11:12 被阅读0次
  • 爬虫步骤:
  1. 获取目标网站 http.get
  2. 分析网站内容 cheerio,可以使用jQuery选择器
  3. 获取有效信息

一. 下面是一个数据分片传输的小例子,仅供热身:

const http=require('https');
let url = 'https://www.jd.com/'
http.get(url,(res)=>{
    // 数据分段,只要接受数据就会触发data事件,chunk就是每次接受的数据片段
    res.on('data',(chunk)=>{
        console.log('数据传输');
    })
    // end表示数据流传输完毕
    res.on('end',()=>{
        console.log('数据传输完毕');
    })
}).on('error',()=>{
    console.log('请求错误');
})
数据量比较大的话会分片传输

二. 下面就把京东的首页给扒下来,存到jd.html文件中:

const http=require('https');
const fs=require('fs');
let url = 'https://www.jd.com/'
http.get(url,(res)=>{
    let rawDate='';
    // 数据分段,流式传输,只要接受数据就会触发data事件,chunk就是每次接受的数据片段
    res.on('data',(chunk)=>{
        console.log('数据传输');
        rawDate += chunk.toString('utf8');
    })
    // end表示数据流传输完毕
    res.on('end',()=>{
        console.log('数据传输完毕');
        // 将请求的数据保存到本地
        fs.writeFileSync('./jd.html',rawDate);
    })
}).on('error',()=>{
    console.log('请求错误');
})

三. 进一步加上判断:

const http=require('https');
const fs=require('fs');
let url = 'https://www.jd.com/'
http.get(url,(res)=>{
//-----------------新加的判断,不是我想要的就终止爬取----------------------------
    // 安全判断
    const { statusCode } = res;  // es6赋值方法,同'statusCode=res.statusCode',表示状态码
    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(err);
        res.resume(); // 重置缓存
        return false;
    }
//---------------------------------------------------------------------------
  
    let rawDate='';
    // 数据分段,流式传输,只要接受数据就会触发data事件,chunk就是每次接受的数据片段
    res.on('data',(chunk)=>{
        console.log('数据传输');
        rawDate += chunk.toString('utf8');
    })
    // end表示数据流传输完毕
    res.on('end',()=>{
        console.log('数据传输完毕');
        // 将请求的数据保存到本地
        fs.writeFileSync('./jd.html',rawDate);
    })
}).on('error',()=>{
    console.log('请求错误');
})

四. cheerio

cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方

安装cheerio

npm install cheerio --save

去npm的官网查询对应的文档:
https://www.npmjs.com/
https://www.npmjs.com/package/cheerio
cheerio的简单使用实例:

const cheerio = require('cheerio');
let $ = cheerio.load('<div><p>你好</p><img src="http://img0.imgtn.bdimg.com/it/u=1734221205,4211923994&fm=214&gp=0.jpg"></div>')

console.log($('img').attr('src'));
console.log($('p').text());

就是用jQuery的语法,要是有多个img标签,可以这样写:

const cheerio = require('cheerio');
let $ = cheerio.load('<div><p>你好</p><img src="http://www.baidu.com"><img src="http://www.taobao.com"></div>')

$('img').each((index,el)=>{
    console.log($(el).attr('src'));
})

五. 爬呀爬

完整代码如下,很多图片没爬到,爬到的都是html文件中的静态图片。

const http=require('https');
const fs=require('fs');
const cheerio=require('cheerio')
const request=require('request')
let url = 'https://www.jd.com/'
http.get(url,(res)=>{
    // 安全判断
    const { statusCode } = res;  // es6赋值方法,同'statusCode=res.statusCode',表示状态码
    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(err);
        res.resume(); // 重置缓存
        return false;
    }
    
    let rawDate='';
    // 数据分段,流式传输,只要接受数据就会触发data事件,chunk就是每次接受的数据片段
    res.on('data',(chunk)=>{
        console.log('数据传输');
        rawDate += chunk.toString('utf8');
    })
    // end表示数据流传输完毕
    res.on('end',()=>{
        console.log('数据传输完毕');
        // 通过cheerio进行分析
        let $=cheerio.load(rawDate) // 将请求到的网页数据进行转化
        $('img').each((index,el)=>{
            // console.log($(el).attr('src'))
            let imgurl=$(el).attr('src');
            // 有的链接没有http头,给他加上
            if(imgurl.indexOf('http')==-1){
                imgurl="http:"+imgurl
            }


            // imgname=imgurl.match(/\{1}[0-9a-zA-Z]+/.png)
            // console.log(imgname)

            request.head(imgurl,function(err,res,body){
                if(err){
                    console.log(err);
                }
            });
            console.log(imgurl)
            // 将图片保存到本地
            request(imgurl).pipe(fs.createWriteStream('./'+ index + ".png")); 
        })

        // // 将请求的数据保存到本地
        // fs.writeFileSync('./jd.html',rawDate);


    })
}).on('error',()=>{
    console.log('请求错误');
})

相关文章

  • 09.node简易爬虫

    爬虫步骤: 获取目标网站 http.get 分析网站内容 cheerio,可以使用jQuery选择器 获取有效...

  • Python+PhantomJS+selenium+Beauti

    Python+PhantomJS+selenium+BeautifulSoup实现简易网络爬虫 简易网络小爬虫,目...

  • NodeJs + Phantomjs 简易爬虫

    NodeJs + Phantomjs 简易爬虫 爬虫是什么? 引用百度百科的说法是: 如何在NodeJs上搭建爬虫...

  • 扇贝简易爬虫

    前段时间因为编译时间过长的问题很是苦恼,玩微信刷微博吧又怕被老板看到而且影响工作,所以准备自己写个爬虫抓取扇贝在背...

  • 简易猫眼爬虫

    过程 1.打开网址分析源码,找出要爬取的信心所在的位置2.一般爬取的内容都有相似的结构,先分析一个,在利用程序批量...

  • nodeJS简易爬虫

    源码:

  • 简易爬虫代码实现——基于python2.7

    简易爬虫代码实现——基于python2.7 # -*- coding:utf-8 -*-import urllib...

  • 简易爬虫框架(二)

    紧接着上回的文章,来书写一个Callback并演示一下爬虫吧。 实例分析 以一个实际的例子为主,即展示爬取一本小说...

  • 简易爬虫框架(一)

    Hello,大家好。上周末比较忙,没时间更新文章。这周就写一点其他的吧。 其实也不算框架吧,只能算简单的封装了一些...

  • python Selenium 简易爬虫

    安装Selenium 终端命令pip install selenium 访问页面、在输入框中填写内容并模拟键盘操作...

网友评论

      本文标题:09.node简易爬虫

      本文链接:https://www.haomeiwen.com/subject/kqaquctx.html