2017-12-01 5 views
0

Ich versuche, eine Website mit load mehr Knopf zu kratzen, aber ich kann nicht eine rekursive Funktion mit in Albtraum. mein Code ist so etwas wie dieses:Kratzen mit "mehr laden" -Taste 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() 

Ich weiß nicht, wenn Sie irgendeine Art und Weise haben es mit dieser Methode oder jede andere Idee

Antwort

0

zu tun Wenn Sie die Daten in der Tabelle verschrotten wollen, müssen Sie brauche keinen Albtraum. sehen von der Registerkarte Netzwerk würden Sie, dass es diesen Endpunkt ruft:

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

mit einigen Paginierung & Seitengröße, nehmen wir 200 pro Seite (weiß nicht, ob es über der Grenze ist).

Dann müssen Sie nur noch html & put Daten in einem Array analysieren:

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

Danke für die Hilfe. Nur um mehr zu klären, habe ich im Browser und im Netzwerk "dev bar" eingecheckt, und es ist möglich, nach den Anfragen an die Webseite zu suchen; selbst wenn es eine unendliche scroll oder load more Taste ist, zeigt es den Aufruf der Domain an, so dass man nicht nach Selektoren suchen muss. –