我正在编写一个基于 nodejs 的网络抓取工具,我设法完成了这项工作,但我想知道是否有更有效的方法来做到这一点以及如何
问题是这样的:
- 为了加快抓取速度,我需要生成到网站的N并行 http 连接(在 http.request 或请求中默认保持活动状态)
- 在完成抓取之前,我还有总共M个请求(任务)要做
- M>>N,实际上M可以是无限的
- 在我的工作中必须使用保持连接,否则我可能会被目标网站踢掉
我目前的解决方案是:
- 初始化M个 http.request/request,它是来自M -requests(tasks)的一对一映射
- 设置http.globalAgent.maxSockets = N
- 让 http.globalAgent 管理连接池
完成了这项工作,没有泄漏,没有失败的请求,N个并发 http 连接,中提琴。问题在于,显然它在开始时分配了大量内存来构建M http.request。
所以我在想:
- 还是让http.request管理连接池,keep-alive
- 构建一个任务生成器,比如T,具有方法T。获取任务()
- 在开始时生成N个请求,触发它们
- 一旦某个请求R完成,执行task= T .fetchTask()并将任务提供给R,重用连接,保持活动状态
但如何?谢谢大家。