node.js - perangkak nod, meminta untuk menetapkan proksi, sentiasa melaporkan ralat untuk mendapatkan bantuan
学习ing
学习ing 2017-06-21 10:12:18
0
2
1114

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
学习ing

membalas semua(2)
伊谢尔伦

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

过去多啦不再A梦

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan