node爬虫,request设置代理,总是报错求助

发布于 2022-09-05 02:13:50 字数 1234 浏览 27 评论 0

我用request爬取图片,为了防止ip被封,用了代理,可是用了代理后,总是报错。nodejs用到了request和async模块

function download(item,cb){
  request({
    url:item.img,
    proxy:proxys[Math.random()*proxys.length|0],
    method:'GET',
    timeout:5000
  },function(err,response,body){
    if(response && response.statusCode == 200){
      cb(null,item);
    }
  }).on('error',function(){
    console.log('下载出现异常,可能是pipe有问题,再次请求...');
    download(item,cb);
    // cb(null,item);
  }).pipe(fs.createWriteStream(fileDir2+item.name+'.'+item.url_token+'.jpg'));
}

download(item,cb) ,cb是async中控制流程的回调函数:

async.eachLimit(items,10,function(item,cb){
    download(item,cb);
},function(){...})

每次下载没几个,就报错停止运行了:

throw new assert.AssertionError({
  ^
AssertionError: 258 == 0
at ClientRequest.onConnect (C:\Users\fox\WebstormProjects\nodejs\实战\爬虫\node_modules\tunnel-agent\index.js:160:14)

如果我去掉代理的请求头,一点事都没有;如果我把上面download里面,改成 不再继续请求,直接cb(),请求失败不会报错。

.on('error',function(){
console.log('下载出现异常,可能是pipe有问题,再次请求...');
  // download(item,cb);
cb(null,item);
})

请大佬看了,能不能帮我解决一下,想了很久,一直排错,不知道什么原因。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

又怨 2022-09-12 02:13:50

我之前也做过几乎和你一样的功能,直接下载图片很多下载了一部分,然后报错了,最后我试着包裹一层setTimeout,类似于:

setTimeout(function(){
    download(item, cb);
},400);

这样居然就好了,我为此写了一篇博文的:nodejs批量下载图片,你可以参考一下

雅心素梦 2022-09-12 02:13:50

遇到这种问题,程序要有重试机制。
一个好的重试机制是:在下一次尝试的时候,适当的增加sleep时间确保正确的执行。

面犯桃花 2022-09-12 02:13:50

最近写爬虫遇到一样的问题了,找了半天在这里(github需要挂代理访问)找到了解决方案。本质上是一个bug,解决方案就是用修复了bug的版本更新一下这个库。

npm install --save git+https://git@github.com/bda-research/tunnel-agent.git
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文