用nodejs爬文件遇到的问题,请各位大大来看看
发布于 13 年前 作者 xieren58 8972 次预览 最后一次回复是 13 年前 来自
我想用nodejs 的http.get爬一堆文件下来,但是这个网站做了限制每次只能同时下载2个文件,而nodejs是异步的,问题来了…例如:
var urlArr = [ /* 一堆文件的url */ ];
for(/* 遍历urlArr */ ) {
http.get(url, ...); // http.get 下载文件
}
怎样做到每次只爬2个文件,或者第一次爬2个文件,然后这两个文件某个爬完了,又自动去爬下一个,总之每次只能有2个下载的请求,因为多了的那些请求是没法下载文件。。
期待大家的解答~~ 灰常感谢~~
28 回复
用老赵的 jscex
正在尝试,但是不知道如何实现,求请教~
@jeffz 麻烦老赵过来看看~~~
var urlArr = […]; count =0; for(…){ while(count==2){ // 休息10分钟 } // 在callback 里面 count-=1; http.get(url,…); count +=1; }
不知道可以不?
文件有大有小,时间不好设置,太长了浪费时间,太短了,那就没法控制2个请求
你這是黑@jeffz 啊
給個不用jscex的例子, 一起爬5個文件
哈哈,async 这个不是很熟悉,我自己用EventEmitter搞定了~~
用node.io https://github.com/chriso/node.io/wiki/API—Job-Options
使用方法:
综合起来貌似用async的forEachLimit最简单~~
@leizongmin 方法不错,谢谢
我觉得用node.io最简单, 内建一个参数就支持几个线程下载
@atian25 node.io 不熟悉呢~
@xieren58
就跟很多人说了用
async.forEachLimit就行了,forEachLimit里面用Jscex写逻辑。如果你真要用Jscex——虽然我不觉得Jscex是处理这些事情的,就在循环里用whenAny吧,whenAny就是等待任意一个完成。还有真的,看看文档吧,不要搞到最后文档是白写的……@atian25 不错~~谢谢~
@jeffz 真心觉得Jscex不错,暂时还是不大会用,看来得认真看文档~~
@xieren58 只要把原本写JavaScript的方法用来写Jscex就行了,剩下的只是了解一个Task。现在发现好多同学是写了回调以后,就不知道怎么写普通JavaScript了……
@jeffz 回调太多,头晕了~
@xieren58 可是 是while啊,时间可以设短点 例如10s
如果用 @Jackson 的eventproxy应该也可以吧,每次成功后抛出事件,然后再次发出爬虫
不用EventProxy, 用Bagpipe马到功成。 https://github.com/JacksonTian/bagpipe
代码基本不用怎么改
太复杂 有没有。
太复杂 有没有。