Maison interface Web js tutoriel Idées de base pour écrire des robots d'exploration avec Node.js et partage d'exemples d'exploration de Baidu images_node.js

Idées de base pour écrire des robots d'exploration avec Node.js et partage d'exemples d'exploration de Baidu images_node.js

May 16, 2016 pm 03:10 PM
javascript js node node.js 爬虫

其实写爬虫的思路十分简单:

  • 按照一定的规律发送 HTTP 请求获得页面 HTML 源码(必要时需要加上一定的 HTTP 头信息,比如 cookie 或 referer 之类)
  • 利用正则匹配或第三方模块解析 HTML 代码,提取有效数据
  • 将数据持久化到数据库中

但是真正写起这个爬虫来,我还是遇到了很多的问题(和自己的基础不扎实也有很大的关系,node.js 并没有怎么认真的学过)。主要还是 node.js 的异步和回调知识没有完全掌握,导致在写代码的过程中走了很多弯路。

模块化

模块化对于 node.js 程序是至关重要的,不能像原来写 PHP 那样所有的代码都扔到一个文件里(当然这只是我个人的恶习),所以一开始就要分析这个爬虫需要实现的功能,并大致的划分了三个模块。

主程序,调用爬虫模块和持久化模块实现完整的爬虫功能
爬虫模块,根据传来的数据发送请求,解析 HTML 并提取有用数据,返回一个对象
持久化模块,接受一个对象,将其中的内容储存到数据库中
模块化也带来了困扰了我一个下午的问题:模块之间的异步调用导致数据错误。其实我至今都不太明白问题到底出在哪儿,鉴于脚本语言不那么方便的调试功能,暂时还没有深入研究。

另外一点需要注意的是,模块化时尽量慎用全局对象来储存数据,因为可能你这个模块的一个功能还没有结束,这个全局变量已经被修改了。

Control Flow

这个东西很难翻译,直译叫控制流(吗)。众所周知,node.js 的核心思想就是异步,但是异步多了就会产生好几层嵌套,代码实在难看。这个时候,你需要借助一些 Control Flow 模块来重新整理你的逻辑。在这里就要推荐开发社区十分活跃,用起来也很顺手的 async.js(https://github.com/caolan/async/)。

async 提供了很多实用的方法,我在写爬虫时主要用到了

  • async.eachSeries(arr, fn, callback)  依次把 arr 中的每一个元素传给 fn,若 fn 回调没有返回错误对象就继续传下一个,否则把错误对象传给 callback,循环结束
  • async.parallel(fn[, fn] , callback)  当所有的 fn 都执行完成后执行 callback

这些控制流方法给爬虫的开发工作带来了很大的方便。考虑这么一个应用场景,你需要把若干条数据插入数据库(属于同一个学生),你需要在所有数据都插入完成后才能返回结果,那么如何保证所有的插入操作都结束了呢?只能是层层回调保证,如果用 async.parallel 就方便多了。

这里再多提一句,本来保证所有的插入都完成这个操作可以在 SQL 层实现,即 transaction,但是 node-mysql 截止我使用的时候还是没有很好的支持 transaction,所以只有自己手动用代码保证了。

解析 HTML

在解析过程中也遇到一些问题,这里一并记录下来。

最基本的发送 HTTP 请求获得 HTML 代码,使用 node 自带的 http.request 功能即可。如果是爬简单的内容,比如获得某个指定 id 元素中的内容(常见于抓去商品价格),那么正则足以完成任务。但是对于复杂的页面,尤其是数据项较多的页面,使用 DOM 会更加方便高效。

而 node.js 最好的 DOM 实现非 cheerio(https://github.com/MatthewMueller/cheerio) 莫属了。其实 cheerio 应该算是 jQuery 的一个针对 DOM 操作优化和精简的子集,包含了 DOM 操作的大部分内容,去除了其它不必要的内容。使用 cheerio 你就可以像用普通 jQuery 选择器那样选择你需要的内容。

下载图片
在爬数据时,我们可能还需要下载图片。其实下载图片的方式和普通的网页没有太大的区别,但是有一点让我吃了苦头。

注意下面代码中言辞激烈的注释,那就是我年轻时犯下的错误……

var req = http.request(options, function(res){

  //初始化数据!!!
  var binImage = '';

  res.setEncoding('binary');
  res.on('data', function(chunk){
   binImage += chunk;
  });

  res.on('end', function(){

   if (!binImage) {
    console.log('image data is null');
    return null;
   }

   fs.writeFile(imageFolder + filename, binImage, 'binary', function(err){
    if (err) {
     console.log('image writing error:' + err.message);
     return null;
    }
    else{
     console.log('image ' + filename + ' saved');
     return filename;
    }
   });
  });

  res.on('error', function(e){
   console.log('image downloading response error:' + e.message);
   return null;
  });
 });

 req.end();

Copier après la connexion

GBK 转码
另外一个值得说明的问题就是 node.js 爬虫在爬 GBK 编码内容时转码的问题,其实这个问题很好解决,但是新手可能会绕弯路。这里就把源码全部奉上:

var req = http.request(options, function(res) {
  res.setEncoding('binary');
  res.on('data', function (chunk) {
  html += chunk;
  });

  res.on('end', function(){
  //转换编码
  html = iconv.decode(html, 'gbk');
  });
 });

 req.end();

Copier après la connexion

这里我使用的转码库是 iconv-lite(https://github.com/ashtuchkin/iconv-lite),完美支持 GBK 和 GB2312 等双字节编码。

实例:爬虫批量下载百度图片

var fs = require('fs'), 
 path = require('path'), 
 util = require('util'), // 以上为Nodejs自带依赖包 
 request = require('request'); // 需要npm install的包 
 
// main函数,使用 node main执行即可 
patchPreImg(); 
 
// 批量处理图片 
function patchPreImg() { 
 var tag1 = '摄影', tag2 = '国家地理', 
  url = 'http://image.baidu.com/data/imgs?pn=%s&rn=60&p=channel&from=1&col=%s&tag=%s&sort=1&tag3=', 
  url = util.format(url, 0, tag1, tag2), 
  url = encodeURI(url), 
  dir = 'D:/downloads/images/', 
  dir = path.join(dir, tag1, tag2), 
  dir = mkdirSync(dir); 
 
 request(url, function(error, response, html) { 
  var data = JSON.parse(html); 
  if (data && Array.isArray(data.imgs)) { 
   var imgs = data.imgs; 
   imgs.forEach(function(img) { 
    if (Object.getOwnPropertyNames(img).length > 0) { 
     var desc = img.desc || ((img.owner && img.owner.userName) + img.column); 
     desc += '(' + img.id + ')'; 
     var downloadUrl = img.downloadUrl || img.objUrl; 
     downloadImg(downloadUrl, dir, desc); 
    } 
   }); 
  } 
 }); 
} 
 
// 循环创建目录 
function mkdirSync(dir) { 
 var parts = dir.split(path.sep); 
 for (var i = 1; i <= parts.length; i++) { 
  dir = path.join.apply(null, parts.slice(0, i)); 
  fs.existsSync(dir) || fs.mkdirSync(dir); 
 } 
 return dir; 
} 
 
var index = 1; 
// 开始下载图片,并log统计日志 
function downloadImg(url, dir, desc) { 
 var fileType = 'jpg'; 
 if (url.match(/\.(\w+)$/)) fileType = RegExp.$1; 
 desc += '.' + fileType; 
 var options = { 
  url: url, 
  headers: { 
   Host: 'f.hiphotos.baidu.com', 
   Cookie: 'BAIDUID=810ACF57B5C38556045DFFA02C61A9F8:FG=1;' 
  } 
 }; 
 var startTime = new Date().getTime(); 
 request(options) 
  .on('response', function() { 
   var endTime = new Date().getTime(); 
   console.log('Downloading...%s.. %s, 耗时: %ss', index++, desc, (endTime - startTime) / 1000); 
  }) 
  .pipe(fs.createWriteStream(path.join(dir, desc))); 
} 
Copier après la connexion

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Apr 03, 2024 am 11:55 AM

La technologie de détection et de reconnaissance des visages est déjà une technologie relativement mature et largement utilisée. Actuellement, le langage d'application Internet le plus utilisé est JS. La mise en œuvre de la détection et de la reconnaissance faciale sur le front-end Web présente des avantages et des inconvénients par rapport à la reconnaissance faciale back-end. Les avantages incluent la réduction de l'interaction réseau et de la reconnaissance en temps réel, ce qui réduit considérablement le temps d'attente des utilisateurs et améliore l'expérience utilisateur. Les inconvénients sont les suivants : il est limité par la taille du modèle et la précision est également limitée ; Comment utiliser js pour implémenter la détection de visage sur le web ? Afin de mettre en œuvre la reconnaissance faciale sur le Web, vous devez être familier avec les langages et technologies de programmation associés, tels que JavaScript, HTML, CSS, WebRTC, etc. Dans le même temps, vous devez également maîtriser les technologies pertinentes de vision par ordinateur et d’intelligence artificielle. Il convient de noter qu'en raison de la conception du côté Web

Enseignement du nœud PI: Qu'est-ce qu'un nœud PI? Comment installer et configurer le nœud PI? Enseignement du nœud PI: Qu'est-ce qu'un nœud PI? Comment installer et configurer le nœud PI? Mar 05, 2025 pm 05:57 PM

Explication détaillée et guide d'installation pour les nœuds de pignon Cet article introduira l'écosystème de pignon en détail - nœuds PI, un rôle clé dans l'écosystème de pignon et fournir des étapes complètes pour l'installation et la configuration. Après le lancement du réseau de test de la blockchain pèse, les nœuds PI sont devenus une partie importante de nombreux pionniers participant activement aux tests, se préparant à la prochaine version du réseau principal. Si vous ne connaissez pas encore Pinetwork, veuillez vous référer à ce qu'est Picoin? Quel est le prix de l'inscription? PI Utilisation, exploitation minière et sécurité. Qu'est-ce que Pinetwork? Le projet Pinetwork a commencé en 2019 et possède sa pièce exclusive de crypto-monnaie PI. Le projet vise à en créer un que tout le monde peut participer

Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Dec 18, 2023 pm 03:39 PM

Avec le développement rapide de la finance sur Internet, l'investissement en actions est devenu le choix de plus en plus de personnes. Dans le trading d'actions, les graphiques en bougies sont une méthode d'analyse technique couramment utilisée. Ils peuvent montrer l'évolution des cours des actions et aider les investisseurs à prendre des décisions plus précises. Cet article présentera les compétences de développement de PHP et JS, amènera les lecteurs à comprendre comment dessiner des graphiques en bougies boursières et fournira des exemples de code spécifiques. 1. Comprendre les graphiques en bougies boursières Avant de présenter comment dessiner des graphiques en bougies boursières, nous devons d'abord comprendre ce qu'est un graphique en bougies. Les graphiques en chandeliers ont été développés par les Japonais

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Pratique efficace du robot d'exploration Java : partage des techniques d'exploration de données Web Pratique efficace du robot d'exploration Java : partage des techniques d'exploration de données Web Jan 09, 2024 pm 12:29 PM

Pratique du robot d'exploration Java : Comment explorer efficacement les données d'une page Web Introduction : Avec le développement rapide d'Internet, une grande quantité de données précieuses est stockée dans diverses pages Web. Pour obtenir ces données, il est souvent nécessaire d’accéder manuellement à chaque page web et d’en extraire les informations une par une, ce qui est sans doute une tâche fastidieuse et chronophage. Afin de résoudre ce problème, les utilisateurs ont développé divers outils de robots d'exploration, parmi lesquels le robot d'exploration Java est l'un des plus couramment utilisés. Cet article amènera les lecteurs à comprendre comment utiliser Java pour écrire un robot d'exploration Web efficace et à démontrer la pratique à travers des exemples de code spécifiques. 1. La base du reptile

La relation entre js et vue La relation entre js et vue Mar 11, 2024 pm 05:21 PM

La relation entre js et vue : 1. JS comme pierre angulaire du développement Web ; 2. L'essor de Vue.js en tant que framework front-end ; 3. La relation complémentaire entre JS et Vue ; Vue.

Comment obtenir facilement le code d'état HTTP en JavaScript Comment obtenir facilement le code d'état HTTP en JavaScript Jan 05, 2024 pm 01:37 PM

Introduction à la méthode d'obtention du code d'état HTTP en JavaScript : Dans le développement front-end, nous devons souvent gérer l'interaction avec l'interface back-end, et le code d'état HTTP en est une partie très importante. Comprendre et obtenir les codes d'état HTTP nous aide à mieux gérer les données renvoyées par l'interface. Cet article explique comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournit des exemples de code spécifiques. 1. Qu'est-ce que le code d'état HTTP ? Le code d'état HTTP signifie que lorsque le navigateur lance une requête au serveur, le service

L'ère de l'IA de JS est arrivée ! L'ère de l'IA de JS est arrivée ! Apr 08, 2024 am 09:10 AM

Introduction à JS-Torch JS-Torch est une bibliothèque JavaScript d'apprentissage en profondeur dont la syntaxe est très similaire à celle de PyTorch. Il contient un objet tensoriel entièrement fonctionnel (peut être utilisé avec des dégradés suivis), des couches et des fonctions d'apprentissage en profondeur et un moteur de différenciation automatique. JS-Torch convient à la recherche sur l'apprentissage profond en JavaScript et fournit de nombreux outils et fonctions pratiques pour accélérer le développement de l'apprentissage profond. Image PyTorch est un framework d'apprentissage profond open source développé et maintenu par l'équipe de recherche de Meta. Il fournit un riche ensemble d'outils et de bibliothèques pour créer et former des modèles de réseaux neuronaux. PyTorch est conçu pour être simple, flexible et facile à utiliser, et ses fonctionnalités de graphique de calcul dynamique font

See all articles