使用nodeJS写一个简单的小爬虫

栏目: Node.js · 发布时间: 5年前

内容简介:需要安装的依赖:使用request向需要爬取的网站发起一个请求,在回调里使用body接收数据我选取百度图库,作为本次爬取的网站

需要安装的依赖:

  • requset

使用request向需要爬取的网站发起一个请求,在回调里使用body接收数据

我选取百度图库,作为本次爬取的网站

使用百度搜素二次元萌妹子,然后在地址栏里将URL复制下来

const request = require('request');

const options = {
    method: "GET",
    url: "https://image.baidu.com/search/index?isource=infinity&iname=baidu&tn=baiduimage&word=%E4%BA%8C%E6%AC%A1%E5%85%83%E8%90%8C%E5%A6%B9",
    headers:{
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
    }
}
//先打印一下,看看是否抓取到了数据
requset(options,(err,res,body)=>{
    console.log(err);
    console.log(res.statusCode);
    console.log(body);
})
复制代码
使用nodeJS写一个简单的小爬虫

当看到控制台输出一大串信息后(网页源代码),且没有报错,statusCode返回200,说明正确请求到了数据。

接着,我们需要对数据,进行处理(对返回的数据,进行分析,拿到我们想要的数据,这里我们想要得到数据是图片的URL地址)。

处理数据的方式:

  • 正则表达式

作为一个程序员,处理字符串,首先想到的当然是正则了

使用nodeJS写一个简单的小爬虫

使用正则去匹配data-url

const request = require('request');

const options = {
    method: "GET",
    url: "https://image.baidu.com/search/index?isource=infinity&iname=baidu&tn=baiduimage&word=%E4%BA%8C%E6%AC%A1%E5%85%83%E8%90%8C%E5%A6%B9",
    headers:{
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
    }
}
//先打印一下,看看是否抓取到了数据
request(options,(err,res,body)=>{
    const reg = /thumbURL":"https?:\/\/.+?&gp=0.jpg/ig;
    const urlArr = body.match(reg);
    const msgArr = [];
    urlArr.forEach(( val,idx ) => {
        const reg = /https?:\/\/.+?&gp=0.jpg/;
        msgArr.push(val.match(reg)[0]);
    })
    console.log(msgArr);
})
复制代码
使用nodeJS写一个简单的小爬虫

匹配成功!!! 我们试着点击一下,能否访问

使用nodeJS写一个简单的小爬虫

就很棒,抓到的数据,没有问题

接着,我们尝试着将图片下载下来

//想要下载图片,就必须请求图片的地址
//访问到图片的静态资源后,使用管道流保存到文件中
//因为I/O操作是异步的,所以使用Promise将代码改写一下
const request = require('request');
const fs = require('fs');//写入文件,需要导入fs模块
const options = {
    method: "GET",
    url: "https://image.baidu.com/search/index?isource=infinity&iname=baidu&tn=baiduimage&word=%E4%BA%8C%E6%AC%A1%E5%85%83%E8%90%8C%E5%A6%B9",
    headers:{
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
    }
}

new Promise(( res,rej ) => {
    request(options,( err,response,body ) => {
        const reg = /thumbURL":"https?:\/\/.+?&gp=0.jpg/ig;
        const urlArr = body.match(reg);
        const msgArr = [];
        urlArr.forEach(( val,idx ) => {
            const reg = /https?:\/\/.+?&gp=0.jpg/;
            msgArr.push(val.match(reg)[0]);
        })
        res(msgArr);
    })
}).then( msgArr => {
    msgArr.forEach(( val,idx ) => {
        request(val).pipe(fs.createWriteStream("./img/"+idx+".jpg"));
    })
})

复制代码
使用nodeJS写一个简单的小爬虫

此时打开文件夹,可以看到图片已经下载成功!

使用正则,可以解析使用JS渲染的页面,如果发起请求后,body接收的数据返回的是一个页面结构,则可以使用以下两个npm包:

  • jsdom
  • cheerio

jsdom可以将数据解析成DOM结构,cheerio则将数据包装成jQuery

以百度搜索为例,如果要抓取搜索结果的标题内容和链接

使用nodeJS写一个简单的小爬虫
使用nodeJS写一个简单的小爬虫
//
const request = require("request")
const {JSDOM} = require("jsdom")
//const cheerio = require("cheerio")

const word = encodeURI("二次元萌妹")
request({
    url : "https://www.baidu.com/s?wd="+word,
    headers:{
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
    }
},(err,response,body)=>{
    if(err)throw err;
    if( response.statusCode >=200 && response.statusCode<300 ){
        //JSDOM处理body
        let {window} = new JSDOM(body);
        let aDOM = window.document.querySelectorAll("h3.t a");
        [...aDOM].forEach(ele => {
            console.log(ele.text,ele.href);
        })

        //cheerio处理body
        /*let $ = cheerio.load(body);
        $("h3.t a").each((i,ele)=>{
            console.log($(ele).attr("href"));
            console.log($(ele).text());
        })*/
    }
});

复制代码

得到的结果

使用nodeJS写一个简单的小爬虫

可以看到操作十分简便,但是如果数据量大,这种方法性能不佳


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法设计与分析

算法设计与分析

陈慧南 / 电子工业出版社 / 2006-5 / 26.80元

《算法设计与分析:C++语言描述》内容分为3部分:算法和算法分析、算法设计策略及求解困难问题。第1部分介绍问题求解方法、算法复杂度和分析、递归算法和递推关系;第2部分讨论常用的算法设计策略:基本搜索和遍历方法、分治法、贪心法、动态规划法、回溯法和分枝限界法;第3部分介绍NP完全问题、随机算法、近似算法和密码算法。书中还介绍了两种新的数据结构:跳表和伸展树,以及它们特定的算法分析方法,并对现代密码学......一起来看看 《算法设计与分析》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具