cari

Rumah  >  Soal Jawab  >  teks badan

node.js - perangkak nod, meminta untuk menetapkan proksi, sentiasa melaporkan ralat untuk mendapatkan bantuan

Saya menggunakan permintaan untuk merangkak imej Untuk mengelakkan alamat IP daripada disekat, saya menggunakan proksi Namun, selepas menggunakan proksi, saya sentiasa melaporkan ralat. nodejs menggunakan permintaan dan modul 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'));
}

muat turun(item,cb), cb ialah fungsi panggil balik aliran kawalan dalam async:

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

Setiap kali selepas memuat turun beberapa fail, ralat berlaku dan operasi berhenti:

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

Jika saya mengalih keluar pengepala permintaan proksi, tiada apa yang akan berlaku jika saya menukar muat turun di atas untuk tidak meneruskan permintaan dan terus cb(), tiada ralat akan dilaporkan jika permintaan gagal.

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

Sila lihat dan lihat jika anda boleh membantu saya menyelesaikannya. Saya telah memikirkannya untuk masa yang lama dan telah menyelesaikan masalah saya tidak tahu mengapa.

学习ing学习ing2801 hari yang lalu1117

membalas semua(2)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-06-21 10:14:18

    Saya telah melakukan fungsi yang hampir sama seperti anda sebelum ini, memuat turun secara langsung banyak gambar, dan kemudian melaporkan ralat Akhirnya, saya cuba membungkus lapisan setTimeout, serupa dengan:

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

    Ini sebenarnya bagus, saya menulis catatan blog tentang ini: nodejs batch memuat turun gambar, anda boleh merujuknya

    balas
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-21 10:14:18

    Apabila menghadapi masalah seperti ini, program mesti mempunyai mekanisme cuba semula.
    Mekanisme percubaan semula yang baik ialah: pada percubaan seterusnya, tingkatkan masa tidur dengan sewajarnya untuk memastikan pelaksanaan yang betul.

    balas
    0
  • Batalbalas