node.js 爬虫 异步延时问题

  1. 比方说有1万个关键词['query1', 'query2' ... ... ]
  2. 我要用这些关键词爬虫抓网上的数据,有两个接口,一个是获取当前query所有的页数,一个是获取当前query当前页的数据。
  3. 首先请求第一个接口拿到当前query有多少页,然后再获取每一次的数据
  4. 每次请求必须等上一个请求完成,防止网站崩溃

我用node写的,请问有解决的办法吗?

阅读 4.1k
3 个回答

这里面涉及到的技术点如下:

  1. 发出 HTTP 请求,用 http 模块的 get 或者 request 函数;
  2. 分析请求到的页面数据,假设页面是 html 页面,可以用 cheerio 来解析页面的 DOM 结构,获取页面上的数据;
  3. 异步流程控制,因为 node.js 是单线程异步执行的,所以你如果两个任务需要串行执行,需要进行流程控制;
  4. 流程控制可以自己实现,也可以用第三方库来实现;

能想到的大概就是这些,欢迎大家补充。

我们有个服务比较类似。主要用到了队列,队列是基于redis实现的,大概原理如下:

  • 实现单个任务的功能
  • 任务A实现后将数据放到到队列A中
  • 任务B从队列A中消费数据,成功则删除当前任务,失败则重新存入,任务B完成后产生的数据存储队列B
  • 任务C从队列B中消费数据,成功则删除当前任务,失败则重新存入,任务C完成后产生的数据存储队列C

这样整个流程的任务呗拆分出来,业务逻辑也简单化,方便维护,并且,任务ABC都是并行计算的,且相对隔离

使用事件来做
list事件,获取当前query的页数,解析链接什么的,然后循环触发detail事件
detail事件,获取详情

进程监听以上两个事件即可,初始化的时候就可以循环触发list事件,传入一个关键词

要是觉得跑太快,可以加settimeout去触发事件

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题