NodeJS 爬虫爬取LOL英雄联盟的英雄信息,superagent+cheerio+async

1.模块使用

(1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,ios的afnetworking)

(2)cheerio:Nodejs中的html解析库(每个语言基本都有。。)

(3)async:Nodejs中的同/异步并发函数执行库(这个非常牛,其他语言同类型的不多)

2.爬取内容

多玩的英雄联盟英雄页面,通过解析页面内每个英雄的URL,然后并发请求英雄的详细数据,提取需要的数据得到结果

http://lol.duowan.com/hero/

这次主要是为了熟悉NodeJS爬虫,所以以1星级难度爬虫练手。

3.源码

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

start();

// 第一步,使用superagent发起get请求,获取含有英雄名字的页面
function start(){
    console.log(‘爬虫程序开始运行......‘);
    superagent
    .get(‘http://lol.duowan.com/hero/‘)
    .end(function(err, res){
        // 请求返回后的页面处理,使用cheerio提取英雄
        var $ = cheerio.load(res.text,{decodeEntities: false});
        //找到每个英雄的链接,并存入数组,等待并行请求
        var heroes = new Array();
        $("a.lol_champion").each(function(i, e) {
            heroes.push($(e).attr("href"));
        });

        //并发遍历heroes对象
        async.mapLimit(heroes,5,
            function (heroUrl, callback) {
            // 对每个角色对象的处理逻辑
                fetchInfo(heroUrl, callback);
            },
            function (err, result) {
                if(err){
                    console.log("error is:"+err);
                }
                //这里的result就是callback回来的数组
                console.log("抓取结束,共计:"+result.length+"个");
                result.forEach(function(hero){
                    console.log(JSON.stringify(hero));
                });
            }
        );

        //串行遍历heroes对象
        // async.mapSeries(heroes,function (heroUrl, callback) {
        //     // 对每个角色对象的处理逻辑
        //         fetchInfo(heroUrl, callback);
        //     },
        //     function (err, result) {
        //         if(err){
        //             console.log("error is:"+err);
        //         }
        //         //这里的result就是callback回来的数组
        //         console.log("抓取结束,共计:"+result.length+"个");
        //         result.forEach(function(hero){
        //             console.log(JSON.stringify(hero));
        //         });
        //     }
        // );
    });
}

// 获取角色信息
var concurrencyCount = 0; // 当前并发数记录
function fetchInfo(heroUrl, callback){
    concurrencyCount++;
    console.log("...正在抓取:"+ heroUrl + "...当前并发数记录:" + concurrencyCount);
    // 根据URL,进行详细页面的爬取和解析
    superagent
        .get(heroUrl)
        .end(function(err, res){
            if(err){
                console.log("fail");
                concurrencyCount--;
                var hero = {
                    succ:false
                }
                //callback左边的参数为error的string,不为null时会打断本次map
                callback(null,hero);
            }else{
                // 获取爬到的角色详细页面内容
                var $ = cheerio.load(res.text,{decodeEntities: false});
                var heroTitle = $(‘.hero-title‘).first().text();
                var heroName = $(‘.hero-name‘).first().text();
                var heroType = $(‘.hero-tag‘).first().text()+" "+$(‘.hero-tag‘).last().text();
                console.log(‘找到英雄:‘+heroTitle+" "+heroName+"|"+heroType);
                concurrencyCount--;
                var hero = {
                    succ:true,
                    title:heroTitle,
                    name:heroName,
                    type:heroType
                }
                //callback后才会结束此并行“线程”
                callback(null, hero);
            }
        });
}

4,工程demo

https://github.com/rayshen/lolcrawler

时间: 2024-12-16 10:34:47

NodeJS 爬虫爬取LOL英雄联盟的英雄信息,superagent+cheerio+async的相关文章

Python编写网页爬虫爬取oj上的代码信息

OJ升级,代码可能会丢失. 所以要事先备份. 一开始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启发和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 python2.7版本, 试了一下修改到3.0版本, 要做很多包的更替,感觉比较烦,所以索性就在这个2.7版本上完善了. 首先观赏一下原始代码,我给加了一些注释: # -*- coding: cp936 -*- import urllib2 import urllib import re import

爬虫 爬取天猫商品的封面信息

# 爬取搜索字段的封面信息 ''' q : 搜索的类型 可以识别中文 天猫控制登录字段: sort: 排序 s:起始第几个商品 问题1: 把s删除以后,虽说可以跳过登陆,但是只能访问第一页了,何解? 解决: 多次点击页面后发现,淘宝测试不完全,在点击跳转页面后,将其的url后的参数只保留 q totalPage jumpto 三个字段后,就可以通过修改jumpto字段的值 来跳转到其他的页面 问题2: 解决登陆问题后,发现无法提前知道totalpage的总页数 解决:只要页面有显示,那我们就能拿

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 结果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

python爬虫爬取美女图片

python 爬虫爬取美女图片 #coding=utf-8 import urllib import re import os import time import threading def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImgUrl(html,src): srcre = re.compile(src) srclist = re.findall(srcre,html)

如何防止网站被爬虫爬取的几种办法

如何防止网站被爬虫爬取的几种办法 小 中 大 chen 2013-10-08 23:26 Linux 547 次浏览 抢沙发 今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对web服务器有比较性能有影响,主要的表现就是会变得很慢. 对于如何防止网站被爬取,我想从以下几种方法去分析: 1.基于程序本身去防止爬取:作为爬虫程序,爬取行为是对页面的源文件爬取,如爬取静态页面的html代码,可以用jquery去模仿写h

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

用Python爬虫爬取广州大学教务系统的成绩(内网访问)

用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是"选择器"."选择器"指明了{}中的"样式"的作用对象,也就是"样式"作用于网页中的哪些元素.可参考:http://www.w3school.com.cn/cssref/css_selectors.asph

如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py文件.我们需要获取的数据是朋友圈和发布日期,因此在这里定义好日期和动态两个属性,如下图所示. 2.修改实现爬虫逻辑的主文件moment.py,首先要导入模块,尤其是要主要将items.py中的WeixinMomentItem类导入进来,这点要特别小心别被遗漏了.之后修改start_requests方