2016-04-15 7 views
2

Zuerst habe ich beide PhantomJs und seine npm Schnittstelle phantom erfolgreich installiert. Ich habe den Code eingestellt, um meine Seite mit der neuen Syntax zu laden (Alle anderen Fragen, die hier gepostet wurden, basierten auf der alten Codesyntax oder ich vermisse etwas). this is the source I'm trying to scrape.Dynamisches Scrapfen mit nodejs und phantomjs

Nun, die rechte Seitenleiste, die mit der Fälschung wählen Sie in der Nähe von "Comune" und die andere wird dynamisch generiert und ich kann nicht verstehen, warum phantomjs sie nicht abholt. Folgen Sie meinem Code:

var sito = "http://bicincitta.tobike.it/"; 
var sitepage = null; 
var phInstance = null; 
var phantom = require('phantom') 

phantom.create() 
    .then((instance) => { 
    phInstance = instance; 
return instance.createPage(); 
}) 
.then((page) => { 
    sitepage = page; 
return page.open(sito); 
}) 
.then((status) => { 
    console.log(status); 
return sitepage.property('content'); 
}) 
.then((content) => { 
    console.log(content); 
sitepage.close(); 
phInstance.exit(); 
}) 
.catch((error) => { 
    console.log(error); 
phInstance.exit(); 
}) 

Ich treffe meinen Kopf hart an einer Wand jetzt. Soll ich die Skripte der Site irgendwie ausführen und ausführen? Fehle ich eine Anweisung?

Auch auf einer Nebennote; es ist nicht wirklich klar, wie sollte ich zusätzliche Methoden zu Seite verketten, wenn die Seite innerhalb der zweiten ".then".

Antwort

1

Ich habe die letzte Woche Arbeit mit PhantomJS versucht, um es zu erhalten, um eine Seite mit Daten, die mit eckigen gerendert wird, Snapshot. Die einfachste Sache, die ich fand, war, page.injectJs('../script.js') für irgendwelche lokalen Indexe und page.includeJs('http://jquery.com...') für irgendwelche externen Indexe zu verwenden. Da Phantom sandboxed ist, wird das JavaScript auf der Seite, die es erfasst, nicht ausgeführt, es sei denn, Sie geben ihm das JS zur Ausführung. Dadurch können Sie eine Seite screenshot, die Daten mit Javascript gerendert hat.

1

Es gibt CData-Skript am Ende des HTML, das nicht von Phantom analysiert werden kann. Von hier werden die Elemente propagiert.

<script type="text/javascript"> 
//<![CDATA[ 
Sys.Application.initialize(); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadAjaxManager, {"_updatePanels":"","ajaxSettings":[],"clientEvents":{OnRequestStart:"",OnResponseEnd:""},"defaultLoadingPanelID":"","enableAJAX":true,"enableHistory":false,"links":[],"styles":[],"uniqueID":"RadAjaxManager1","updatePanelsRenderMode":0}, null, null, $get("RadAjaxManager1")); 
}); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadAjaxPanel, {"clientEvents":{OnRequestStart:"",OnResponseEnd:""},"enableAJAX":true,"enableHistory":false,"links":[],"loadingPanelID":"","styles":[],"uniqueID":"ajCheckLoginUser"}, null, null, $get("ajCheckLoginUser")); 
}); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadAjaxPanel, {"clientEvents":{OnRequestStart:"",OnResponseEnd:""},"enableAJAX":true,"enableHistory":false,"links":[],"loadingPanelID":"","styles":[],"uniqueID":"ajCheckLoginAdmin"}, null, null, $get("ajCheckLoginAdmin")); 
}); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadAjaxPanel, {"clientEvents":{OnRequestStart:"",OnResponseEnd:""},"enableAJAX":true,"enableHistory":false,"links":[],"loadingPanelID":"","styles":[],"uniqueID":"ajLogoutUser"}, null, null, $get("ajLogoutUser")); 
}); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadWindow, {"_dockMode":false,"behaviors":0,"clientStateFieldID":"radPortal_ClientState","destroyOnClose":true,"formID":"form1","height":"180px","iconUrl":"","left":"","minimizeIconUrl":"","modal":true,"name":"radPortal","reloadOnShow":true,"showContentDuringLoad":false,"skin":"Office2007","top":"","visibleStatusbar":false,"width":"450px"}, {"close":OnClientClosePortal}, null, $get("radPortal")); 
}); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadWindowManager, {"behaviors":4,"clientStateFieldID":"windowManagerPortal_ClientState","destroyOnClose":true,"formID":"form1","iconUrl":"","left":"","minimizeIconUrl":"","modal":true,"name":"windowManagerPortal","reloadOnShow":true,"showContentDuringLoad":false,"skin":"Office2007","top":"","visibleStatusbar":false,"windowControls":"['radPortal']"}, null, {"child":"radPortal"}, $get("windowManagerPortal")); 
    }); 
//]]> 
</script> 

Diese Elemente werden auch zerstört, sobald Sie die Kommunikation mit diesem Sites-Server verlassen. Es gibt Methoden, um dies zu umgehen, aber ich denke, Sie sind besser dran, etwas anderes zu versuchen. Ich benutzte npm cheerio, um die CDATA html

zu laden