node.js. 爬虫(客户端)

120 阅读2分钟

为啥用这个爬数据?py 不香吗?

回答:简单,js 方便在页面上验证,不用转换。

Tips bulldozer-c已打包,使用时只需要集成即可。

项目结构如下: 工程地址

├─ config            # 配置信息:定义 ip、port
├─ node_modules      # 利用npm管理的所有包及其依赖
├─ lib               # 库:封装的一些工具
├─ example           # 栗子:存放脚本等,也可以是别的名字
├─ package.json      # npm的配置文件:脚本、依赖等
├─ package-lock.json # npm的配置文件:脚本、依赖等
└─ index.js          # 工程入口:具体实现

客户端这块主要功能是:请求、解析、抓取。

先跑起来

工程 clone下来: 项目地址

工程基于 npmmac下可使用 brew install npm进行安装。

依赖下载,直接运行:npm install

运行的话是直接执行脚本:node crawl_contact_info/init_list.js

这样就算 OK 了。

一些问题

  1. 参数什么含义?如何使用?
handlerContext = bc.httpUtils.buildHttpcontext('GET', {
    'next': 'info',  // HTTP 请求完后,下一动作
    'url': link
}, undefined, null);

// postdata: undefined, HTTP 请求的数据?

// timeout: null,HTTP 超时时间?
  1. 如何参数传递?
// 可以如下使用:
crawl.on('list', function (handlerContext) {
    let body = handlerContext.response.body;
    let data = handlerContext.data; // 上一个请求带过来的数据
    handlerContext = bc.httpUtils.buildHttpcontext('GET', {
        'next': 'info',  
        'url': link,
        'category': data.category // 重点
    });
}
  1. 整体调度参数如何使用?
bc.taskInit(); // 只初始化一次
// bc.setTaskInitInterval(20, 0.1); // 定时执行,这个跟上面存在一个即可。

bc.runTask({'name': TASK_NAME}, crawl, TASK_NAME, 5, bc.spop, 1000);
// Tips:TASK_NAME 
  1. 打通后,调度流程是怎样?

客户端启动后,BulldozerC会定时调度,会从 redis 中拿取任务。

  1. 有点不好测试
  • 要批量测试有点麻烦了:以及联动测试麻烦

  • 数据聚合只能顺序调用

举个🌰:要聚合两个页面数据,只能一个个处理,一个嵌套一个再处理。

  1. 元素定位出错,错误处理怎样?

目前:出错了,抛异常,再扔到队列中,等下次重试。

所以,一些无关紧要的实际上可以直接忽略。

  1. token cookie只能手动添加?不能自动?

目前只能手动。

  1. ORM :此框架支持字段自动映射嘛?

不支持。

举个🌰:数据字段 mainProducts,数据库字段 main_products,不会自动映射。


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情