2017-02-26 3 views
1

nightmarejs (브라우저로 전자를 사용하는 phantomjs 파생물)가있는 instagram 프로필 페이지에서 일부 정보를 긁어 내려고합니다.nightmarejs가 querySelectorAll을 사용하여 여러 요소를 긁음

목표는 프로필의 모든 이미지의 ALT 태그를 얻을 것입니다 (나는 전에 이미지 만에 초점 예제 위해 '더보기'버튼)

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); 
 
    }); 
 

이를 예제가 작동하면 배열의 길이는 12입니다. 전자 브라우저가 열리고 닫히기 때문에 모든 것이 좋습니다. 하지만 배열로 돌아가려면 전자 브라우저가 닫히지 않고 console.log가 생기지 않습니다.

내가 뭘 잘못하고 있니? 배열이나 객체의 이미지에서 모든 정보를 얻고 싶습니다.

답변

5

document.querySelectorAll()의 문제는 NodeListDOMElement입니다. 이 두 객체 유형은 잘 직렬화되지 않으며 .evaluate()의 반환 값은 IPC 경계를 통해 직렬화되어야합니다. .evaluate() 호출의 반대쪽에 빈 배열이 생기고 있습니다.

여기서 가장 쉬운 대답은 구체적으로 사용자가 NodeList에서 원하는 것을 찾아내는 것입니다. 엉덩이에서 다음과 같은 아이디어를 얻어야합니다.

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

감사합니다. 그것은 나를 위해 그것을했다. – tarpier

+0

이것은 아마도 대부분의 사람들에게 최상의 솔루션 일 것입니다. 그러나 데이터에 대해 많은 추출/테스트/기타 작업을 수행해야하는 경우 완전히 다른 접근법은'return document.body.innerHTML'을 리턴 한 다음 노드 측에서 jsdom을 인스턴스화하고/또는 jquery 객체. 이 시점에서 가상 돔과 상호 작용하는 것은 간단합니다. – rinogo

관련 문제