使用Node.js制作爬虫教程(续:爬图)

简介: 使用Node.js制作爬虫教程(续:爬图)前几天发了《使用Node.js制作爬虫教程》之后,有朋友问如果要爬文件怎么办,正好之前也写过类似的,那就直接拿过来写个续篇吧,有需要的可以借鉴,觉得不好的可以留言交流。
使用Node.js制作爬虫教程(续:爬图)

前几天发了《使用Node.js制作爬虫教程》之后,有朋友问如果要爬文件怎么办,正好之前也写过类似的,那就直接拿过来写个续篇吧,有需要的可以借鉴,觉得不好的可以留言交流。

案例回顾

上一篇中,主要利用nodejs发起一个getData请求来得到4星角色的id列表。通过chrome开发者工具来查看页面结构,分析得出角色详细页面的URL规则和详细页面中想要抓取内容的位置。再循环遍历4星角色id列表去发起角色详细页面的请求并解析出想要收集的内容。

具体内容可再参考原文:使用Node.js制作爬虫教程

目标分析

案例回顾中提到的角色详细页面(参考样例),有不少图片内容,本文就以抓取“主动技能”的GIF图片为例,来改造一下前文的代码以完成定向抓取图片的效果。

alt=

通过Chrome查看图片对象的URL规则为:/img/as2/角色id.gif

编码过程

构建工程和引入框架

$npm init
$npm install --save superagent
$npm install --save cheerio
$npm install --save async

上篇代码逻辑

  1. 发起getData.php请求,获得所有4星角色的ID
  2. 依次循环根据char/角色id规则访问各个角色的详细页面,并解析其中需要的数据并按我们想要的方式存储起来

本篇代码逻辑:

  1. 发起getData.php请求,获得所有4星角色的ID
  2. 依次循环根据/img/as2/角色id.gif规则下载gif文件到本地

所以,只要修改上篇代码中对每个角色对象的处理逻辑部分的内容为下载文件即可。

具体代码如下:

var superagent = require('superagent'); 
var cheerio = require('cheerio');
var async = require('async');

var fs = require('fs');
var request = require("request");

console.log('爬虫程序开始运行......');

// 第一步,发起getData请求,获取所有4星角色的列表
superagent
    .post('http://wcatproject.com/charSearch/function/getData.php')
    .send({ 
        // 请求的表单信息Form data
        info: 'isempty', 
        star : [0,0,0,1,0], 
        job : [0,0,0,0,0,0,0,0], 
        type : [0,0,0,0,0,0,0], 
        phase : [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
        cate : [0,0,0,0,0,0,0,0,0,0], 
        phases : ['初代', '第一期','第二期','第三期','第四期','第五期','第六期', '第七期','第八期','第九期','第十期','第十一期','第十二期','第十三期','第十四期', '第十五期', '第十六期'],
        cates : ['活動限定','限定角色','聖誕限定','正月限定','黑貓限定','中川限定','茶熊限定','夏日限定'] })
    // Http请求的Header信息
    .set('Accept', 'application/json, text/javascript, */*; q=0.01')
    .set('Content-Type','application/x-www-form-urlencoded; charset=UTF-8')
    .end(function(err, res){  
        
        // 请求返回后的处理
        // 将response中返回的结果转换成JSON对象
        var heroes = JSON.parse(res.text);    
        // 并发遍历heroes对象
        async.mapLimit(heroes, 5,
            function (hero, callback) {
                // 对每个角色对象的处理逻辑
                var heroId = hero[0];   // 获取角色数据第一位的数据,即:角色id
                fetchInfo(heroId, callback);
            }, 
            function (err, result) {
                console.log('抓取的角色数:' + heroes.length);
            }
        );

    }); 

// 获取角色信息
var concurrencyCount = 0; // 当前并发数记录
var as2Url = 'http://wcatproject.com/img/as2/';
var fetchInfo = function(heroId, callback){

    // 下载链接
    var url = as2Url + heroId + '.gif';
    // 本地保存路径
    var filepath = 'img/' + heroId + '.gif';

    // 判断文件是否存在
    fs.exists(filepath, function(exists) {
        if (exists) {
            // 文件已经存在不下载
            console.log(filepath + ' is exists');
            callback(null, 'exists');
        } else {
            // 文件不存在,开始下载文件
            concurrencyCount++;
            console.log('并发数:', concurrencyCount, ',正在抓取的是', url);

            request.head(url, function(err, res, body){
                if (err) {
                    console.log('err: '+ err);
                    callback(null, err);
                }
                request(url)
                    .pipe(fs.createWriteStream(filepath))
                    .on('close', function(){
                        console.log('Done : ', url);
                        concurrencyCount --;
                        callback(null, url);
                    });
            });
        }
    });



};

主要修改内容:

对fs模块和request模块的引用,前者用来读写文件,后者用来通过http请求获取文件。

var fs = require('fs');
var request = require("request");

fetchInfo函数修改成拼接url和本地保存路径,并通过request进行下载。

由于图片下载较慢修改并发数,async.mapLimit(heroes, 5, function (hero, callback)

执行情况如下,根据配置的并发数5,可以看到如下输出

$ node index.js
爬虫程序开始运行......
并发数: 1 ,正在抓取的是 http://wcatproject.com/img/as2/SS0441.gif
并发数: 2 ,正在抓取的是 http://wcatproject.com/img/as2/NS1641.gif
并发数: 3 ,正在抓取的是 http://wcatproject.com/img/as2/SS1141.gif
并发数: 4 ,正在抓取的是 http://wcatproject.com/img/as2/SS1041.gif
并发数: 5 ,正在抓取的是 http://wcatproject.com/img/as2/SS0941.gif
Done :  http://wcatproject.com/img/as2/SS1141.gif
并发数: 5 ,正在抓取的是 http://wcatproject.com/img/as2/SS0841.gif
Done :  http://wcatproject.com/img/as2/SS0841.gif
并发数: 5 ,正在抓取的是 http://wcatproject.com/img/as2/LS0941.gif
Done :  http://wcatproject.com/img/as2/SS1041.gif
并发数: 5 ,正在抓取的是 http://wcatproject.com/img/as2/LS1441.gif
Done :  http://wcatproject.com/img/as2/NS1641.gif
并发数: 5 ,正在抓取的是 http://wcatproject.com/img/as2/SS0741.gif
Done :  http://wcatproject.com/img/as2/LS0941.gif
并发数: 5 ,正在抓取的是 http://wcatproject.com/img/as2/SS0641.gif

示例到此结束,有需要的去爬爬爬,至于爬什么我就不负责啦,_

代码参考:http://git.oschina.net/didispace/nodejs-learning

目录
相关文章
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
534 19
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
1730 31
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
16628 23
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
1175 2
2024年5月node.js安装(winmac系统)保姆级教程
|
数据采集 API 数据格式
Python 原生爬虫教程:京东商品详情页面数据API
本文介绍京东商品详情API在电商领域的应用价值及功能。该API通过商品ID获取详细信息,如基本信息、价格、库存、描述和用户评价等,支持HTTP请求(GET/POST),返回JSON或XML格式数据。对于商家优化策略、开发者构建应用(如比价网站)以及消费者快速了解商品均有重要意义。研究此API有助于推动电商业务创新与发展。
|
JavaScript 前端开发
js教程——函数
js教程——函数
472 4
|
数据采集 Web App开发 数据可视化
Python爬虫教程:Selenium可视化爬虫的快速入门
Python爬虫教程:Selenium可视化爬虫的快速入门
|
数据采集 JSON 前端开发
JavaScript逆向爬虫实战分析
JavaScript逆向爬虫实战分析
621 4