nodejs爬网页图片

本文介绍了一种使用Node.js进行网页图片爬取的方法,利用https、fs、cheerio和request模块,从指定URL抓取图片并保存到本地。首先发送HTTP请求获取HTML,然后解析DOM提取图片URL,最后下载图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:https://segmentfault.com/a/1190000012412007

该示例通过nodejs爬取网页图片
相关模块:
nodejs核心模块
https fs
第三方模块
cheerio
类似jquery写法获取所得页面dom元素
request
发送request请求
原理流程:

  1. 先向服务器发送请求,获取到网页的html
  2. 对网页html做处理,获取到标题的文本和图片的src中的url
  3. 再发送请求,请求图片的url,通过流的方式写到本地目录中
var http = require('https'); //使用https模块
var fs = require('fs');//文件读写
var cheerio = require('cheerio');//jquery写法获取所得页面dom元素
var request = require('request');//发送request请求
var i = 0;
var url = "https://movie.douban.com/subject/1889243/?from=subject-page";
//初始url 
function fetchPage(x) { //封装一层函数,方便递归调用
    startRequest(x);
}

function startRequest(x) {
    //采用http模块向服务器发起一次get请求      
    http.get(x, function(res) { //get到x网址,成功执行回调函数
        var html = ''; //用来存储请求网页的整个html内容
        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件,每次取一块数据
        res.on('data', function(chunk) {
            html += chunk;
        });
        //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
        res.on('end', function() {
            var $ = cheerio.load(html); //采用cheerio模块解析html
            console.log($);
            
            var news_item = {
                //获取电影的标题
                title: $('.related-info h2 i').text().trim(),
                //i是用来判断获取页数
                i: i = i + 1,

            };

            console.log(news_item); //打印新闻信息
            var news_title = $('.related-info h2 i').text().trim();

            savedContent($, news_title); //存储每篇文章的内容及文章标题

            savedImg($, news_title); //存储每篇文章的图片及图片标题

            //下一篇电影的url
            nextLink = $(".recommendations-bd dl:last-child dd a").attr('href');
            if(i <= 10) { //爬取10页
                fetchPage(nextLink);
            }
        });

    }).on('error', function(err) { //http模块的on data,on end ,on error事件
        console.log(err);
    });

}
//存储标题函数
function savedContent($, news_title) {
    $('#link-report span').each(function(index, item) {
        var x = $(this).text();
        x = x + '\n';
        //将新闻文本内容一段一段添加到/data文件夹下,并用新闻的标题来命名文件
        fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function(err) {
            if(err) {
                console.log(err);
            }
        });
    })
}
//该函数的作用:在本地存储所爬取到的图片资源
function savedImg($, news_title) {
    $('#mainpic img').each(function(index, item) {
        var img_title = $('#content h1 span').text().trim(); //获取图片的标题
        if(img_title.length > 35 || img_title == "") { //图片标题太长
            img_title = "Null";
        }
        var img_filename = img_title + '.jpg';
        var img_src = $(this).attr('src'); //获取图片的url
        console.log(img_src);
        

        //采用request模块,向服务器发起一次请求,获取图片资源
        request(img_src).pipe(fs.createWriteStream('./image/' + news_title + '---' + img_filename));
        //通过流的方式,把图片写到本地/image目录下,并用标题和图片的标题作为图片的名称。
    })
}
fetchPage(url); //主程序开始运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值