Cet article présente principalement le robot d'exploration multipage basé sur nodejs L'éditeur pense qu'il est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un oeil.
Préface
J'ai revu le temps du front-endnode.js, donc j'en ai profité de la situation et créé un robot d'exploration. Approfondissez votre compréhension de node.
Les trois modules principalement utilisés sont request, cheerio et async
request
pour demander des adresses et un téléchargement rapide imagesflux.
cheerio
Une implémentation de base jQuery rapide, flexible et implémentée spécialement personnalisée pour le serveur.
Code HTML facile à analyser.
async
Appel asynchrone pour éviter le blocage.
Idée principale
Utilisez la demande pour envoyer une demande. Obtenez le code html et obtenez la balise img et une balise.
Faites un appel récursif à travers l'expression obtenue. Obtenez en continu l'adresse img et une adresse, continuez à récurer
obtenez l'adresse img via request(photo).pipe(fs.createWriteStream(dir + «/» + filename)); pour un téléchargement rapide.
function requestall(url) { request({ uri: url, headers: setting.header }, function (error, response, body) { if (error) { console.log(error); } else { console.log(response.statusCode); if (!error && response.statusCode == 200) { var $ = cheerio.load(body); var photos = []; $('img').each(function () { // 判断地址是否存在 if ($(this).attr('src')) { var src = $(this).attr('src'); var end = src.substr(-4, 4).toLowerCase(); if (end == '.jpg' || end == '.png' || end == '.jpeg') { if (IsURL(src)) { photos.push(src); } } } }); downloadImg(photos, dir, setting.download_v); // 递归爬虫 $('a').each(function () { var murl = $(this).attr('href'); if (IsURL(murl)) { setTimeout(function () { fetchre(murl); }, timeout); timeout += setting.ajax_timeout; } else { setTimeout(function () { fetchre("http://www.ivsky.com/" + murl); }, timeout); timeout += setting.ajax_timeout; } }) } } }); }
Anti-pits
1 Lorsque la demande est téléchargée via l'adresse de l'image, liez l'erreur événement <. 🎜> pour éviter une interruption anormale de Crawler.
hyperliens adresses, qui peuvent être des chemins relatifs (à déterminer s'il existe une solution).
function downloadImg(photos, dir, asyncNum) { console.log("即将异步并发下载图片,当前并发数为:" + asyncNum); async.mapLimit(photos, asyncNum, function (photo, callback) { var filename = (new Date().getTime()) + photo.substr(-4, 4); if (filename) { console.log('正在下载' + photo); // 默认 // fs.createWriteStream(dir + "/" + filename) // 防止pipe错误 request(photo) .on('error', function (err) { console.log(err); }) .pipe(fs.createWriteStream(dir + "/" + filename)); console.log('下载完成'); callback(null, filename); } }, function (err, result) { if (err) { console.log(err); } else { console.log(" all right ! "); console.log(result); } }) }
Test :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!