Basic Node.js (Node Spider1)

Node的基础与Node.jsの爬虫(上)


说到爬虫,一般会先想到Scarpy或者BeautifulSoup这样的python库 但是 当工程量比较小的时候 不需要像Scarpy这样的企业级分布式爬虫的时候 虽然TTfish非常的咸鱼 身为前端工程师 还是用Nodejs比较舒服(才没有表扬Node呢 口亨) 这篇blog主要总结一下之前的经验 尤其是对于学校教务网的探索心得(逃)

本文包括以下内容:

  • Nodejs的使用
  • NPM的简易操作
  • Node爬虫
  • Fetch 和 Promise请求队列
  • 万恶的教务网!

TTfish自己都没想到会有这么多要写 一篇根本写不完 要不还是分开写吧….


Node.js

Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Javasrcipt是一门动态类型,面向对象的解释型语言 和Java有相似之处 但是还是有很多的区别(明明叫Livescript 为了蹭Java热度才改的名) 人们发现将它即时编译有非常大的应用前景 于是就有了Node.js这样的前后端兼吃的环境 Node.js不支持多线程(不像Python那样的假多线程) 但是它是非阻塞的 支持并发(不像世界上最好的语言) 它是事件驱动的 带有优秀的npm 包管理器

要用Node.js写爬虫 首先得有node环境

Download Node.js 根据不同的操作系统下载并安装Node.js

安装好以后 无论在Terminal / Konsole 还是在 cmd \ powershell(可能需要允许环境变量) 中 都可以运行Node.js了

1
2
3
$ node -v // 查看版本
$ node //运行node
> console.log("hello ttfish!") //相当于在Chrome里的Console状态

简单的完成了hello ttfish的打印 如果需要用node执行以.js结尾的文件 只需要

1
$ node ttfish.js

这样简单的node环境就搭建完成了 一般会用server来实现nodejs的hello world 这里跳过

NPM的简易使用

NPM(Node Package Manager)是Node.js的包管理库 方便模块管理 就像PEAR->PHP一样的概念

下载Node的时候 其实已经把npm装好了 可以输入

1
$ npm -v // 查看版本

对于npm最多的操作 就是npm install安装包 并在js文件中引用 但是 首先应该先初始化npm并生成package.json 这个是个坑 npm会根据package.json配置安装项 优秀的开源工程一般都只需要在git clone以后 一键npm install就安装完成所有的所需项 (就速度而言 推荐设置淘宝源)

1
$npm init // 初始化 生成package.json  // 请认真填写!! 不然会凉

正常的话 会发现多了package.json文件 默认情况下 npm install的文件会保存在node_modules文件夹中

Node爬虫需要引入的包有许多 先写一个最简单的 :

1
$ vim ttfish.js
1
2
$ npm install cheerio // 一个自认为长的像jQuery就很厉害 其实比jQuery还猥琐的库 解析html作用
$ npm install fetch // 处理http请求

(关于 -save和–save-dev的区别 请注意)

使用Fetch 简要的爬取zhihu首页html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const cheerio = require('cheerio')
const fetch = require('node-fetch')
const url = 'https://www.zhihu.com'

// 箭头函数的使用 还有好多能加的参数 具体参考官方文档

fetch(url, {
method: POST,
header: {
// some Headers
}
body: // 假装有body
})
.then(res => res.text())
.then(body => {
let $ = cheerio.load(body) // 这里开始迷之cheerio 蜜汁jQuery既视感
$('***').map((i, item) => { // 这里必须吐槽 这个map居然是需要将index作为第一个参数传入的!震惊.jpg
// 假装要提取DOM元素进行操作
}
})
// 以上只是框架 具体代码可以在我的Github上寻找
1
$ node ttfish.js //运行即可

Github 源码

笔记

向对象添加键值对的方法: A[b] = C —踩坑已久
删除对象键值对: delete D.e
map forEach对于数组的操作 不作用于对象
对于FormData的append 不适用于一般对象

假的小结

先讲到这里吧 写不动 写不动 至少最简单的内模块Fetch可以使用了 当然 SuperAgent库也是没有问题的 爬虫的本质就是向服务端发送请求并对Response进行解析 Node.js写爬虫其实不是很稳 虽然写的爽 但是用起来不是很优雅 之前跑了3000张图片流爬虫 如果全部异步node就会炸 维持10个一组的队列勉勉强强跑了六组跑完了 感觉这样在python的情况下可能会更舒服 等下次再写Promise队列和教务网的爬虫 Promise真是个好东西 hhhh

Share