2017-02-26 2 views
1

J'essaie de récupérer quelques informations d'une page de profil d'instagram avec nightmarejs (un dérivé de fantôme utilisant l'électron comme un navigateur).nightmarejs gratter plusieurs éléments avec querySelectorAll

Le but est d'obtenir les balises alt de toutes les images sur le profil (pour l'amour des exemples que je me concentre uniquement sur les images avant que le bouton « Afficher plus »)

var Nightmare = require('nightmare'); 
 
var nightmare = Nightmare({ show: true }); 
 

 
nightmare 
 
    .goto('https://www.instagram.com/ackerfestival/') 
 
    .evaluate(function() { 
 
    let array = [...document.querySelectorAll('._icyx7')]; 
 
    return array.length; 
 
    }) 
 
    .end() 
 
    .then(function (result) { 
 
    console.log(result); 
 
    }) 
 
    .catch(function (error) { 
 
    console.error('Search failed:', error); 
 
    }); 
 

Cette exemple fonctionne, le tableau a une longueur de 12. Le navigateur d'électrons s'ouvre et se ferme, donc tout va bien. Mais si je change le retour en seulement le tableau, le navigateur d'électrons ne se ferme jamais et je n'ai pas de console.log.

Qu'est-ce que je fais mal? Je veux obtenir toutes les informations des images dans un tableau ou un objet.

Répondre

5

Le problème que vous rencontrez est document.querySelectorAll() renvoie NodeList de DOMElement s. Ces deux types d'objet ne se sérialisent pas bien, et la valeur de retour de .evaluate() doit sérialiser à travers la limite IPC - Je parie que vous obtenez un tableau vide de l'autre côté de votre appel .evaluate()?

La réponse la plus simple ici est de tracer ce que, spécifiquement, vous voulez de NodeList. De la hanche, quelque chose comme le suivant devrait avoir l'idée à travers:

.evaluate(function(){ 
    return Array.from(document.querySelectorAll('._icyx7')).map(element => element.innerText); 
}) 
.then((innerTexts) => { 
    // ... do something with the inner texts of each element 
}) 
+0

merci! ça l'a fait pour moi. – tarpier

+0

C'est probablement la meilleure solution pour la plupart des gens. Cependant, si vous devez faire beaucoup d'extractions/tests/etc sur les données, une approche totalement différente qui fonctionne bien pour moi est simplement de retourner 'return document.body.innerHTML' et ensuite du côté du noeud, instancier un jsdom et/ou objet jquery. À ce moment, interagir avec le dom virtuel est trivial. – rinogo