node.js - node爬蟲,request設定代理,總是報錯求助
学习ing
学习ing 2017-06-21 10:12:18
0
2
977

我用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); })

請大佬看了,能不能幫我解決一下,想了很久,一直排錯,不知道什麼原因。

学习ing
学习ing

全部回覆 (2)
伊谢尔伦

我之前也做過幾乎和你一樣的功能,直接下載圖片很多下載了一部分,然後報錯了,最後我試著包裹一層setTimeout,類似於:

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

這樣居然就好了,我為此寫了一篇博文的:nodejs批量下載圖片,你可以參考一下

    过去多啦不再A梦

    遇到這種問題,程序要有重試機制。
    一個好的重試機制是:在下次嘗試的時候,適當的增加sleep時間確保正確的執行。

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!