2017-12-01 1 views
0

로드 버튼으로 웹 사이트를 긁어 내려고했지만 악몽과 함께 재귀 기능을 수행 할 수 없습니다. 내 코드는 다음과 같은 것입니다 :이 방법 또는 다른 생각에 의해 그것을 할 수있는 방법이있는 경우"더 많은로드"단추가있는 긁힌 자국 JS

const Nightmare = require('nightmare'); 
const nightmare = Nightmare({ 
show:true 
});// } 
const request = require('request'); 
const cheerio = require('cheerio'); 

let url = 'https://www.housers.com/es/proyectos/avanzado'; 
let propertyArray = []; 

var getThePage = function() { 

    nightmare 
     .goto('https://www.housers.com/es/proyectos/avanzado') 
     .wait(1500) 
     .click('#loadMore') 
     .evaluate(() =>{ 
     return document.querySelector('.all-info').innerHTML; 
     }) 
    .end() 
    .then((result) => { 
     let $ = cheerio.load(result); 
     let loadMore = $('#loadMore') 
     if (loadMore) { 
      getThePage(); 
     } 
     return result 
     }) 
     .catch((error) => { 
     console.error('Search failed:', error); 
     }); 
     } 
    getThePage() 

모르겠어요

답변

0

테이블의 데이터를 폐기하려는 경우, 당신에게 악몽을 쓸 필요가 없다. 네트워크 탭에서, 당신은이 엔드 포인트를 호출하는 것을 볼 것입니다 : 일부 매김 & 페이지 크기

https://www.housers.com/es/proyectos/avanzado/scroll 

가의 페이지 당 200 (이 한계 이상인지 모르는) 보자. 도움을

const axios = require('axios'); 
const querystring = require('querystring'); 
const cheerio = require('cheerio'); 
const entities = require("entities"); 

const url = 'https://www.housers.com/es/proyectos/avanzado/scroll'; 

const prices = []; 

function doRequest(url, page){ 
    return axios.post(url + '?page=' + page + '&size=200', querystring.stringify({ 
    word: "", 
    country: "", 
    type: "", 
    order: "STOCK_PRICE_VARIATION", 
    orderDirection: "DESC" 
    })); 
} 

async function getPrices() { 
    var empty = false; 
    var page = 0; 

    while (!empty) { 
    //call API 
    console.log("GET page n°" + page); 
    var res = await doRequest(url, page); 
    page++; 

    //parse HTML 
    const $ = cheerio.load(res.data,{ 
     xmlMode: true, 
     normalizeWhitespace: true, 
     decodeEntities: true 
    }); 

    if (res.data.trim() !== ""){ 
     //extract prices : put it in array 
     $('tr').map(function(){ 
     var obj = []; 
     $(this).children('td').map(function(){ 
      obj.push(entities.decodeHTML($(this).text().trim())); 
     }); 
     prices.push(obj); 
     }); 
    } 
    else { 
     empty = true; 
    } 
    } 
    console.log(prices); 
    console.log("total length : " + prices.length); 
} 

getPrices(); 
+0

감사 :

은 그럼 그냥 배열에 HTML & 넣어 데이터를 분석해야합니다. 더 많은 것을 명확히하기 위해 나는 브라우저와 내부 네트워크 "dev bar"에서 체크인했고, webesite에 대한 요청을 확인할 수 있었다. 무한 스크롤 또는 더 많은 버튼을로드하더라도 선택기를 찾을 필요가 없으므로 도메인에 대한 호출이 표시됩니다. –

관련 문제