Nodejs相关依赖模块介绍

Nodejs的优势这里就不做介绍啦,这年头相信大家对它也不陌生了。这里主要介绍一下用到的第三方模块。

  • async:js代码中到处都是异步回调,很多时候我们需要做同步处理,使用async可以大大简化我们的同步处理的任务(没有它的时候,可能要用递归去处理异步问题了)。
  • jsdom:一个 W3C DOM 的 JS 实现。用这玩意相当犀利,它不仅可以将文档解析成 DOM,而且,你还可以用 YUI 或着 jQuery 去操作生成的 DOM。这在从页面中提取数据时格外有用。这次采集17173的游戏排行数据就是用它结合jQuery去做的。
  • colors:这个主要是便于我们从终端中输出不同颜色的信息用的,它的用法相当简单,console.log的时候直接在字符串后附加相关的颜色信息就可以了。

17173游戏排行页面分析

17173游戏排行页面:http://top.17173.com/index-0-0-0-0-0-0-0.html

我们要抓取它的排行,游戏名,热度值和测试状态信息,为了保存方便,直接将抓取的这些信息以CSV格式文件保存。

排行信息总共有63页,使用Chrome调试发现,请求不同页的数据时,发送的是HTTP POST请求,不同的页数通过page参数传递的,参数t可以忽略,主要是清浏览器缓存用的,如下图所示:

使用Chrome查看html结构,我们要抓取的数据在ul.ph-bd-list li中,如下图所示:

在前端获取游戏排行列表的Html信息时,使用jQuery,$('.ph-bd-list li')可以非常方便的定位到列表信息,如果在服务端也能使用这种方式提取信息岂不爽哉,如下图所示:

Nodejs在服务端使用jQuery采集游戏排行信息

首先要解决的问题是,如何使用nodejs发送post请求,并从服务器返回的信息中得到html。

完成这件事并不难,查看一下nodejs,http模块相关的文档,文档中刚好有个示例,几乎可以直接拿来用,需要注意的是,nodejs接收服务端返回的数据时,是以数据块的形式接收的,我们需要将这些数据块,拼装成完整的数据,代码如下:

// 构造请求信息
var options = {
hostname: 'top.17173.com',
port: 80,
path: '/index-0-0-0-0-0-0-0.html?page=' + index,
method: 'POST'
}; var req = http.request(options, function(res) {
var html = '';
res.setEncoding('utf8');
// 拼装数据
res.on('data', function (chunk) { html += chunk; });
res.on('end', function () {
parseHtml(html, callback); // 对html做解析处理
});
}); req.on('error', function(e) {
console.log(('请求列表页失败: ' + e.message).red);
}); // write data to request body
req.write('data\n');
req.write('data\n');
req.end();

接下来需要对html做处理,我们需要用jsdom将html解析为DOM,并跟jQuery结合,确保在服务端能够使用jQuery操作DOM,为了便于使用,我把这些操作做了简单的封装,核心代码如下:

var jsdom = require('jsdom').jsdom
, fs = require('fs')
, jquery = fs.readFileSync("./jquery.js", "utf-8"); /**
* 使用jsdom将html跟jquery组装成dom
* @param {[type]} html 需要处理的html
* @param {Function} callback 组装成功后将html页面的$对象返回
* @return {[type]} [description]
*/
function makeDom(html, callback) {
jsdom.env({
html: html,
src: [jquery],
done: function (errors, window) {
var $ = window.$;
callback(errors, $);
window.close(); // 释放window相关资源,否则将会占用很高的内存
}
});
}

借助上面封装的代码,现在我们就可以非常方便的使用jQuery在服务端操作html了,尤其是使用jQuery提取信息,示例代码如下:

makeDom(html, function (errors, $) {
// 游戏排行列表
var gameList = $('.ph-bd-list li');
// 获取每一个游戏信息
gameList.each(function () {
var li = $(this);
// 游戏信息,各个信息间使用逗号拼接
var gameInfo = '';
// 游戏排名
gameInfo += li.find('span.ttime').text() + ',';
// 游戏名称
gameInfo += li.find('span.game-name a').text() + ',';
// 热度值
gameInfo += li.find('span.type').text() + ',';
// 测试状态信息
gameInfo += $.trim(li.find('span.jhm').text());
// 输出抓取的信息
console.log(gameInfo.white);
// 将游戏信息保存到文本文件
fs.appendFileSync('17173_game_rank.csv', gameInfo + '\r\n');
});
console.log(('第' + index + '页抓取完毕').yellow);
// 设置抓取下一页
index++;
// 执行回调,通知async本次抓取结束
callback();
});

最终程序跑起来的效果

代码也来一份吧

代码加注释也就100多行,不多,也不复杂,希望能给用到的人带来点思路。

下载后,先使用npm install命令安装依赖模块,然后使用node app.js执行即可。

jsdom在windows上的安装貌似还有些麻烦,大家参考这篇文章自行解决一下吧:http://www.swordair.com/blog/2012/05/901/

代码在这

借助Nodejs在服务端使用jQuery采集17173游戏排行信息的更多相关文章

  1. 示例 - 25行代码等价实现 - 借助Nodejs在服务端使用jQuery采集17173游戏排行信息

    今天在园子里看到一篇文章: 借助Nodejs在服务端使用jQuery采集17173游戏排行信息 感觉用SS来实现相同功能更加简洁, 于是写了一下, 发现25行代码就搞定了 (包括自动翻页), 于是跟大 ...

  2. nodejs实现服务端重定向

    nodejs实现服务端重定向:https://www.jianshu.com/p/5a1500fcd713

  3. vuejs+nodejs支持服务端渲染的博客系统

    感悟 历时两个多月,终于利用工作之余完成了这个项目的1.0版本,为什么要写这个项目?其实基于vuejs+nodejs构建的开源博客系统有很多,但是大多数不支持服务端渲染,也不支持动态标题,只是做到了前 ...

  4. nodejs 开发服务端 child_process 调试方法(1)

    由于最近正在做一个服务端项目,采用了nodejs引擎开发,主要是master-worker工作机制;主进程可以直接调试,但是子进程调试好像有点麻烦,我没有找到好的方法; worker这里,我分拆成了几 ...

  5. nodejs 上传图片(服务端输出全部代码)

    下面代码,全部都是nodejs端的,不用客户端代码.也就是,选择图片的form表单以及上传完毕预览图片的html,都是由node服务端输出的. 1 启动代码:(node upload.js) var ...

  6. jsonp协议 java服务端、JQuery客户端 简单实现原理

    原文链接:https://blog.csdn.net/Activity_Time/article/details/96440806 1. 概述 Jsonp(JSON with Padding) 是 j ...

  7. nodejs 开发服务端 部署到 iis 服务器环境 -- iisnode 安装问题解决记录

    开发环境 nodejs: v10.15.3 windows: 10 iis: 10 需求: 用Nodejs开发了服务端,要部署到IIS 需要在IIS服务器上安装iisnode,结果遇到问题:安装不上 ...

  8. 【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found -- The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

    问题描述 使用NodeJS的后端应用,开发一个Mobile App的服务端,手机端通过REST API来访问获取后端数据.在本地编译好后,通过npm start启动项目,访问效果如下: 但是,当把项目 ...

  9. nodejs服务端使用jquery操作Dom

    添加模块:   npm install jquery@3.2.1   npm install jsdom 引入模块:   var jsdom = require("jsdom"); ...

随机推荐

  1. ajax讲解:“创建用户”和“用户登录”练习

    ajax可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面.   接下来,将以例子的形式进行讲解   例一:创建用户   ...

  2. Linux之sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  3. oracle VS postgresql系列-行列转换

    [需求]例如先有数据为 id | name ------+--------- | lottu | xuan | rax | ak | vincent 现在需要转换为 id | names ------ ...

  4. [转]application windows are expected to have a root view controller错误

    转载地址:http://blog.sina.com.cn/s/blog_6784e6ea01017jfy.html 最新更正:这个提示几乎不影响编译和运行,可以不用设置.     产生这个提示的操作: ...

  5. hibernate关于一对一用法

    首先来说一下数据库的表结构吧.主要涉及到两张表.一张是订单表sub_table 一张是商品表.       之后说entity public class SubTable { private Inte ...

  6. asp.net 页面跳转传值的几种方式

    参考地址: http://blog.csdn.net/zzzzzzzert/article/details/8486143 protected void Button1_Click(object se ...

  7. Self Numbers 分类: POJ 2015-06-12 20:07 14人阅读 评论(0) 收藏

    Self Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22101   Accepted: 12429 De ...

  8. C#相对路径转绝对路径,绝对路径转相对路径

    1.绝对路径转相对路径 绝对转相对似乎C#没有提供实现,需要自己写,这里摘选了一位博友的实现方法: string RelativePath(string absolutePath, string re ...

  9. 【TCP】超时与重传

    在TCP连接中假设发送方一开始便向网络发送多个报文段,直到达到接收方通告的窗口大小为止.当发送方和接收方处于同一个区域网段时,这种方式是可以的.但是如果发送方和接收方之间存在多个路由器和速率较慢的链路 ...

  10. ural 1114,计数dp

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1114 题意:N个盒子,a个红球,b个蓝球,把求放到盒子中去,没有任何限制,有多少种放法. ...