J'utilise PhantomJS + wget pour voir le contenu de la page (ce qui est mon objectif) sur une page javascript.

Voici la commande que j'utilise:

$ phantomjs save_page.js http://wzdig.pbc.gov.cn:8080/dig/ui/advsearch.action > page.html

Étant save_page.js

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

Mais le html montre "请 开启 JavaScript 并 刷新 该页" qui signifie "activer javascript".

Qu'est-ce que je fais mal?

Merci.

0
Zaico 15 janv. 2017 à 12:37

2 réponses

Meilleure réponse

Voir la mise à jour sous la ligne.

La raison pour laquelle votre exemple n'a pas fonctionné est la page cible délicate qui teste si la page est ouverte dans un vrai navigateur capable de faire du javscript. La première fois que la page est chargée, votre navigateur reçoit un javascript à exécuter. Ensuite, la deuxième fois que la page est chargée, la page réelle est affichée.

Mais dans votre exemple, le script se termine juste après le chargement de la première page.

Une solution un peu meilleure qui ne repose pas sur un délai d'expiration de 3 secondes (la connexion aux sites chinois est souvent lente, nous ne pouvons pas être sûrs à 100% que 3 secondes suffisent).

var system = require('system');
var page = require('webpage').create();

var system = require('system');
var page = require('webpage').create();

// Imitate a real browser
page.viewportSize = { width: 1440, height: 900 };
page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36";

// Called every time a page is loaded
page.onLoadFinished = function(){

    // If the real page with search controls is loaded
    // then get page.content and exit
    var inputCount = page.evaluate(function(){
        return document.querySelectorAll(".jfk-textinput").length;
    });

    if(inputCount > 0) {
        console.log(page.content);
        phantom.exit();
    }

};

page.open(system.args[1]);

MISE À JOUR

Ok, donc vous êtes probablement après les résultats de la recherche. Dans ce cas, vous pouvez modifier la logique qui décide que la page s'est chargée dans cette solution:

var inputCount = page.evaluate(function(){
    return document.querySelectorAll("h3").length;
});

... car les titres des articles trouvés sont affichés avec des balises

.

2
Vaviloff 16 janv. 2017 à 12:39

Vous devez définir userAgent, ce script fonctionne:

var page = require('webpage').create({viewportSize:{width: 1600,height: 900},
settings:{userAgent:'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0',
javascriptEnabled:'true',
loadImages:'false'
}});
var system = require('system');

page.open(system.args[1], function(){
setTimeout(function(){
    console.log(page.content);
    phantom.exit();
},3000);
});
2
user4535610user4535610 15 janv. 2017 à 10:39