有时突然奇想,想要快速获取某些网站的页面数据,但是没有合适的工具。
其实,开发一个爬虫工具是非常简单的。
这次我准备以爬取著名的插画网站:pixiv为案例,介绍如何爬取网站的页面数据
代码已经准备好,github地址
pixiv已用React重写,没有使用Service-side Rendering,所以普通的爬取方法是行不通的,日后再使用puppeteer
进行重写爬取方法。
创建项目
- 现在任意文件夹中创建一个名为 test-crawler
- 进入 test-crawler 文件夹,开启 bash 或者 cmd 并cd到这个文件内,使用
npm init --yes
快速初始化package.json
文件
创建好后,文件夹中会有如下的文件:
1 | -(test-crawler) |
创建可执行脚本
在文件夹中创建 bin 文件夹,
并在 bin 文件中创建
crawling.js
文件创建好后,文件夹中会有如下的文件:
1
2
3
4- (test-crawler)
|_ bin
|_ crawling.js
|_ package.json打开
crawling.js
加入以下代码
1
2
console.log('test crawling');
第一行代码是用在 Linux 以及 Unix 的注释,用来判断node的文件位置。
如果你使用的操作系统是Linux 或者 Unix,MacOs,可以先使用 which node
命令得到 node 的位置。
创建全局的脚本命令
- 创建完脚本后,打开
package.json
。 - 加入以下代码:
1
2
3
4
5
6
7
8
9
10{
// ...
"bin": {
"crawling": "bin/crawling.js",
},
// ...
script: {
"crawling": "bin/crawling.js",
}
}
使用 bin
可以告诉 node,你需要创建的全局命令名以及命令需要执行的文件。
- 在项目根目录下使用
npm link
为命令创建一个全局的path。这样就可以在任意位置执行命令。1
npm link
这个不建议在开发进行时使用,因为每次修改后需要重新 npm link
,使用 npm link
时需要重新安装 node_modules
。所以,开发时仍然是手动执行 crawling.js
文件。
使用这个命令前,要先删掉当前文件夹中的 node_modules
,否则会遇到 syscall unlink
的问题。
测试命令
任意文件夹中执行命令
1
2$ crawling
crawling // 输出结果测试结束后记得执行
npm unlink
删除链接。
命令行参数
当我们执行以下命令时可以将命令标识后面的文字输入到nodejs的进程中。
1
crawling somevalue
接收这些参数的变量名为
process.argv
process.argv
process.argv
是一个数组,将传入的值以空格分开。打开
crawling.js
,修改代码:1
2
3
4
5
console.log('test crawling');
for (let item of process.argv) {
console.log(item);
}执行
1
2
3
4
5
6$ node ./bin/crawling somevalue othervalue
test crawling // 输出test crawling
node // 第一个参数
./bin/crawling // 第二个参数
somevalue // 第三个参数
othervalue // 第四个参数
node进程会把上面的命令所有值以空格分开保存到 process.argv
。
commander
commander 是一个简化命令行参数操作的库。
修改
crawling.js
1
2
3
4
5
6
7
8
9
const program = require('commander');
program
.version('test-crawler v0.0.1', '-v, --version')
.option('-u, --urls [address]', 'Set the url [address] for img', '')
.option('-i, --ids [illust_id]', 'Set the [illust_id] which belong to img', '')
.option('-o, --output [output_path]', 'Set the img [output_path]', '')
.option('-n, --file-name [file_name]', 'Custom [file_name]', '')
.parse(process.argv);commander
内置了version
方法,可以生成一个版本的命令。此外,我们试着先加入一些命令
‘-u, –urls’ 都是表示同一个命令,前者是缩写,后者是全写,跟在后面的方括号以及里面的字符串是用来表示这个命令可以接收一个参数
比如:命令名 -u somgarg 或者 命令名 –urls somgarg执行命令,输出版本号
1
2$ node ./bin/crawling -v
test-crawler v0.0.1
Commander
的更多介绍和使用方法可以查看仓库
爬虫代码
关羽爬虫的核心,主要集中在:
- 获取网页的真实内容
- 分析DOM节点
对此我们需要使用到
- cheerio
- superagent
- superagent-charset
- 安装
1
npm install -S cheerio superagent superagent-charset
分析和获取需要爬取的网站内容,然后解析内容
- 以插画网站:pixiv的插画页面为例,首先获取页面内容
1 | /** |
- 分析网页中图片的DOM结构,获取对应的DOM节点,再获取图片地址
经分析得出:
图片在 ._illust_modal .wrapper .original-image
1 | /** |
- 下载片,并写入本地(代码较多,可以去仓库查看)
1 | /** |
发布npm-package
注册一个npm账号
在本地执行命令
1
npm login
登录成功后
执行1
npm publish
结论
创建一个基于 Nodejs
的命令行工具,最基本的几点:
- 在
package.json
中加入命令名和命令的执行脚本路径 - 添加
bin
文件夹,在bin
文件夹中中加入执行脚本 - 执行脚本的顶部需要声明
1
#!/usr/bin/env node
- 使用
Commander
或其他工具库处理命令行参数,也可以不使用。 - 根据情况使用
cheerio
或者puppeteer
爬取网页内容。