应邀写一点使用Node.js爬点资料的实例,对于大家建站爬一些初始资料或者做分析研究的小伙伴们应该有些帮助。

目标分析

目标地址:http://wcatproject.com/charSearch/

抓取内容:抓取所有4星角色的数值数据。如果我们采用手工采集的步骤,需要先进入目标地址,然后选择4星角色的选项,页面下方出现所有4星角色的头像,依次点击每个4星角色头像后会出现角色的详细页面,记录下详细页面中数据。显然这样的做法如果角色一多,手工处理是非常吃力的,所以我们就需要一个自动的脚本去完成这样的动作。大家不妨先手工试试这样的访问步骤,有助于后面的分析和实践。

页面分析:

  1. 进入http://wcatproject.com/charSearch/
  2. 打开Chrome的“开发者工具”,选择“Network”标签。点亮“Record Network Log”按钮
  3. 第一步页面操作:在页面中“星数”选择“4”,查询出所有4星角色,观察Network中记录的请求信息。可以看到一个名为“getData.php”的请求,如图所示:
    alt=getData请求查看
  4. getData.php中的重要信息记录(通过nodejs发起请求时候需要)
    4.1 Request URL我们需要调用的请求地址:
    http://wcatproject.com/charSearch/function/getData.php
    4.2 Request Method该请求的类型:POST
    4.3 Request Header请求的头信息
    4.4 Form Data请求的表单信息
    4.5 ResponsePreview中可以看到返回的内容和格式化内容,可以看到返回的是一个角色ID和角色名称的数组内容

    alt=getData返回内容格式

    4.6 在“开发者工具”中选择“Elements”标签,点击左上角的放大镜,将鼠标移到下方伙伴的头像部分点击鼠标左键,可以看到这块的HTML结构。可以看到每个角色的链接的规则为char/角色id

    alt=角色链接查看
  5. 第二部页面操作:点击页面下面查询出的4星角色的头像,进入到角色详细页面,观察Network中记录的请求信息。可以找到一个名为“SS0441”的请求,如上步骤,记录下相关信息,由于这个请求的Request Method为GET,因此没有Form Data信息。

最后在理一下思路,我们的脚本过程如下:

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

准备工作

  • Node.js环境搭建
  • 一款具有代码高亮功能文本编辑器,如Sublime Text等
  • 使用nvm工具将Node.js版本设置为5.0.0

创建工程

  • 选择一个目录,新建一个准备存放工程内容的文件夹demo。
  • 打开终端(windows机器打开CMD命令行),输入npm init,根据提示,逐步输入工程信息,具体示例如下
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.See `npm help json` for definitive documentation on these fields
and exactly what they do.Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.Press ^C at any time to quit.
name: (workspace) demo
version: (1.0.0)
description: 爬虫案例
entry point: (index.js)
test command:
git repository:
keywords:
author: 程序猿DD
license: (ISC)
About to write to /Users/diyongchao/Documents/workspace/package.json:{"name": "demo","version": "1.0.0","description": "爬虫案例","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "程序猿DD","license": "ISC"
}Is this ok? (yes) yes
$
  • 此时文件夹下生成了一个package.json文件,其中包含了工程的基本信息以及引用的框架等信息

框架引入

  • superagent:发起http请求
  • cheerio:解析http返回的html内容
  • async:多线程并发控制

安装命令 npm install --save PACKAGE_NAME,执行以下三条命令后,工程目录下多了一个node_modules目录,该目录就是引入的框架内容。

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

编码过程

工程目录下,创建index.js

var superagent = require('superagent');
var cheerio = require('cheerio');
var async = require('async');console.log('爬虫程序开始运行......');// 第一步,发起getData请求,获取所有4星角色的列表
superagent.post('http://wcatproject.com/charSearch/function/getData.php').send({ // 请求的表单信息Form datainfo: '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, 1, function (hero, callback) {// 对每个角色对象的处理逻辑var heroId = hero[0];   // 获取角色数据第一位的数据,即:角色idfetchInfo(heroId, callback);}, function (err, result) {console.log('抓取的角色数:' + heroes.length);});}); // 获取角色信息
var concurrencyCount = 0; // 当前并发数记录
var fetchInfo = function(heroId, callback){concurrencyCount++;// console.log("...正在抓取"+ heroId + "...当前并发数记录:" + concurrencyCount);// 根据角色ID,进行详细页面的爬取和解析superagent.get('http://wcatproject.com/char/' + heroId).end(function(err, res){  // 获取爬到的角色详细页面内容var $ = cheerio.load(res.text,{decodeEntities: false});                 // 对页面内容进行解析,以收集队长技能为例console.log(heroId + '\t' + $('.leader-skill span').last().text())concurrencyCount--;callback(null, heroId);});};

工程目录下执行命令,node index.js,抓取程序开始执行

$ node index.js
爬虫程序开始运行......
SS0441  平衡型傷害增加 (20%)
NS1641  防禦型的移速增加 (20%)
SS1141  技術型的技能傷害增加 (20%)
SS1041  攻擊型的SP增加 (15%)
SS0941  攻擊型傷害增加 (20%)
SS0841  劍士減傷 (10%) / 技術型減傷 (15%)
LS0941  全員傷害增加 (15%)
LS1441  劍士傷害增加 (10%)  /  技術型傷害增加 (15%)
SS0741  劍士雷屬性傷害增加 (50%)
SS0641  攻擊型傷害增加 (20%)
NS1741  技能型的SP消費減少 (15%)
NS1141  全員傷害增加 (15%)
NS0031-A    獲得的魂增加 (20%)
SS0501  技術型傷害增加 (20%)
SS0141  劍士傷害增加 (20%)
SS0241  全員傷害增加 (15%)

后记

如果觉得爬的慢,可以通过修改下面代码中的1来调整并发数量

async.mapLimit(heroes, 1, function (hero, callback)

同时也可以放开下面的注释,来观察执行过程中并发数

console.log("...正在抓取"+ heroId + "...当前并发数记录:" + concurrencyCount);

如果对示例有疑问,欢迎留言交流_

使用Node.js制作爬虫教程相关推荐

  1. Node.js期中爬虫实验项目

    Node.js期中爬虫实验项目 期中作业要求 基础概念引入 前期准备工作 安装node.js 安装数据库 安装Navicat Premium 15 正则表达式学习网站 课堂示例演示 示例一(显示在终端 ...

  2. 【Mac】从0开始用node.js制作爬取结果的查询网站

    [Mac]从0开始用node.js制作爬取结果的查询网站 实验要求 实验结果展示 简单了解实验项目所需知识 1 爬虫原理 2 JavaScript语法 3 网络元素的提取 4 正则表达式 5 其他有关 ...

  3. #1使用html+css+js制作网站教程 准备

    #1使用html+css+js制作网站教程 准备 本系列链接 0 准备 0.1 IDE编辑软件 0.2 浏览器 0.3 基础概念 0.3.1 html 0.3.2 css 0.3.3 js 0.4 文 ...

  4. 视频教程-Node.JS - socket.io教程-Node.js

    Node.JS - socket.io教程 全栈开发工程师,现职于北京一家学院的全栈教学主任. 8年前端开发经验.4年移动端开发经验.4年UI设计经验.3年一线教学经验. 精通Node.JS.PHP. ...

  5. 《Node.js 极简教程》 东海陈光剑

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. https://nodejs. ...

  6. python爬取大众点评数据_利用Node.js制作爬取大众点评的爬虫

    前言 Node.js天生支持并发,但是对于习惯了顺序编程的人,一开始会对Node.js不适应,比如,变量作用域是函数块式的(与C.Java不一样):for循环体({})内引用i的值实际上是循环结束之后 ...

  7. node.js简单爬虫

    这里假设你已经安装好node.js和npm,如果没有安装,请参阅其他教程安装. 配置 首先是来配置package.json文件,这里使用express,request和cheerio. package ...

  8. 使用React和Node.js制作网易云音乐App的一次总结 【实现全部基本核心功能】

    一.技术选型 语言选择: JavaScript TypeScript 最终选择了JavaScript作为开发语言,一开始尝试使用TypeScript,但是由于是移动端,antd-mobile的库与TS ...

  9. 如何使用Node.js制作实时体育应用程序

    您将要创造的 在今天的文章中,我将演示如何制作一个Web应用程序,以显示NHL的实时比赛得分. 分数将随着游戏的进行而自动更新. 对于我来说,这是一篇非常令人兴奋的文章,因为它使我有机会将我最喜欢的两 ...

最新文章

  1. java with关键字_[Java教程]javascript 里面 with 关键字
  2. Generator 函数的含义与用法
  3. 实用ExtJS教程100例-002:MessageBox的三种用法
  4. 如何应用AutoML加速图机器学习任务的处理?
  5. 算法学习总结(三):插入排序
  6. Nancy 学习-视图引擎 继续跨平台
  7. Python切分文本(将文本文档切分为词列表)
  8. python--采集1(urllib模块)
  9. 敲了 10000 小时代码,我也没能成为一名高级程序员
  10. 创建目录_Word创建自动目录,你会了吗?
  11. matlab blms算法程序,LMS算法Matlab程序
  12. c# Hello World
  13. CICD详解(九)——gitlab简单使用
  14. 《JAVA程序设计教程 第7版》pdf 附下载链接
  15. 客流量统计分析系统应用解决方案
  16. 技术人员的会议优化记录
  17. Android Studio开发中的各种开源API
  18. 嗜血法医第一二三季/Dexter全集迅雷下载
  19. python 生物信息学_生物信息学算法之Python实现
  20. iphone 升级后闪退

热门文章

  1. centos磁盘满了,查找大文件并清理
  2. 菜鸟学Linux - 用户与用户组基础
  3. Dynamics CRM2013 Server2012R2下IFD部署遇到There is already a listener on IP endpoint的解决方法...
  4. POJ3349 Snowflake Snow Snowflakes(哈希表)
  5. IList,ICollection,IEnumerable,IEnumerator,IQueryable
  6. Servlet转发forward和重定向response.sendRedirect()区别
  7. Nginx常见错误码解决方案
  8. LVS-DR模型实现调度
  9. 解决ssh登录慢,等待时间长的问题
  10. EasyUI TextBox的onkeypress事件