Newsgroup: it.comp.www.php
Titolo: Scraping di una pagina particolare

Salve NG
Con l'aiuto delle funzioni DOM di php sto tentando di catturare testo
dai link di una pagina web.
Tutto ok se non fosse che alcuni di essi vengono inniettati da JS
nell'output della stessa risultando inesistenti al momento del
prelievo.
Sto usando fsockopen che naturalmente se ne frega di domready....
Secondo voi esiste una soluzione al mio problema?
Grazie
Alex

 Secondo voi esiste una soluzione al mio problema?
No, indipendentemente dal linguaggio usato.
Se una parte della pagina viene generata "esternamente" non puoi sapere 
se e quando č completa.
Per ipotesi: JS puň lavorare sia in modo sincrono che asincrono, e nel 
secondo caso non hai modo di verificare dall'esterno lo stato della 
chiamata; oppure la pagina potrebbe essere completa ma al click su un 
link ne potrebbero venire generati altri via JavaScript.
Quindi puoi aggirare il problema con dei compromessi/accrocchi (es. 
delle sleep o un sistema di caching progressiva, come fanno alcuni sw di 
questo tipo), ma restano tali.

 questo tipo), ma restano tali.
La butto li, conscio che è una follia: trasformi la pagina html con
wkhtmltopdf (che usa webkit e renderizza il javascript, tant'è che lo
uso per creare guide pdf con tanto di mappe google dinamiche), poi
parsi il pdf e vai a recuperare i dati che ti servono.
Ma è follia ;)

 Ma è follia ;)
No: a parte il formato PDF è il sistema che usano la maggior parte dei 
sw di grabbing o scraping.
Però come dicevo è un accrocchio: quando trasformi la pagina in PDF come 
fai a sapere che i vari script hanno finito il caricamento e quindi la 
pagina è completa?
Non risolvi il problema di partenza...
Ribadisco però che la cosa va valutata caso per caso: è ben diverso 
scaricarsi dei siti statici senza JS o google maps ;-)

 scaricarsi dei siti statici senza JS o google maps ;-)
Rileggendo la domanda dell'OP e la mia prima risposta ci tengo però a 
chiarire che non sto dicendo che non sia *mai* possibile farlo ma solo 
che aumentando il numero di possibili casistiche si aumenta la 
complessità del codice, in modo non lineare.
Quindi, visto che la domanda riguardava l'operazione su una pagina 
_particolare_ (sperando che sia sinonimo di "specifica", non di 
"anomala" ;-) ), nulla vieta di capire cosa impedisca l'operazione su 
quella particolare pagina e mettere in piedi un metodo che aggiri il 
caso particolare. Se ho ben capito il significato di "iniettati da JS" 
probabilmente basterà una sleep... :-)
Quello che mancherà sempre sarà la garanzia del risultato, per cui il 
controllo umano è inevitabile.

 Non risolvi il problema di partenza...
lo sò perchè ho testato wkhtmltopdf su pagine dove i settaggi
javascript erano caricati da php (ma poco conta questo), e la mappa
era inizializzata tramite jquery con $(document).ready();
Poi se lo script javascript viene eseguito con un timer probabilmente
anche wk fallisce, ma in quel caso non saprei proprio come aiutarti.

Altra idea: ti installi iMacros, imposti la macro che visiti la
pagina, aspetta X secondi e te la salva da qualche parte sul server, e
poi la vai parsare l'html completo.
Resta da vedere quanto sia usabile imacros da riga di comando.

Grazie.
Credo che il problema sia nel fatto che ne fsockopen ne curl ne altri
metodi via php emulino un vero e proprio browser per effettuare questo
tipo di processo.
Del resto curl ochicchessia che se ne farebbe si un motore JS ?
Ho trovato questo package, che potrei cmq testare solo in locale
però... sembra interessante
ma pure questa strada sembra un'accrocchio!
Summary 	Spidermonkey JavaScript engine for PHP
License 	PHP License
Description 	This extension allow you to embed Mozilla's Javascript
engine Spidermonkey in PHP.
Homepage 	
http://pecl.php.net/package/spidermonkey
Qui un'assaggio
http://blog.pascal-martin.fr/post/spidermonkey-javascript-serveur-depuis-php#executer-javascript-depuis-php
Alex

 Alex
Facci sapere se funziona ;)
se ho capito bene però per usarlo devi prima fare lo scrape per
cercare file js (e per i js inline), scaricarteli, aggiungerli e
rifare lo scraping.. nzomma, un pò macchinoso

 
http://blog.pascal-martin.fr/post/spidermonkey-javascript-serveur-depuis-php#executer-javascript-depuis-php
Purtroppo non vedo né la possibilità di aggiungere eventi né relativi 
listener o simili. Tutti gli esempi usano o funzioni con return o 
"espongono" la variabile da far ritornare dallo script (cosa fattibile 
solo se hai lo script).
Dammi retta, non complicarti la vita: fai partire la procedura di grab 
della pagina, metti una sleep di n secondi e "accontentati" (in senso 
buono) ;-)
Altrimenti trovi dei sw, anche open, più complessi che svolgono 
operazioni simili, fermo restando il punto dei vari gradi di possibile 
indeterminazione dovuta alla variabilità del codice contenuto nelle pagine.
Però non mi è ancora chiaro se ti interessa una pagina "specifica", di 
cui quindi puoi studiare il comportamento una tantum, o se interessa il 
discorso in termini generali.

 buono) ;-)
Puoi aspettare finchè vuoi, ma se il 'reader' della pagina non esegue
il javascript non cambia niente (prova a visitare un sito con
programmi tipo lynx o links)

 programmi tipo lynx o links)
Non mi sembra che il problema fosse questo.
Il 17/02/2011 14:36, PsyCat ha scritto:
 > Tutto ok se non fosse che alcuni di essi vengono inniettati da JS
 > nell'output della stessa risultando inesistenti al momento del
 > prelievo.
Lo interpreto come: JS funziona ma crea i contenuti dopo che ho gi� 
scaricato la pagina.
Se ho interpretato male me ne dispiaccio, comunque a parte questo ultimo 
suggerimento il resto del discorso resta valido.

 prelievo.
se - come mi sembra di capire - sulla pagina c'e' un javascript che
presenta contenuti non originariamente presenti nel sorgente della
pagina, vuol dire che li richiama tramite ajax o altra tecnica da un
webservice. Se a te interessa il testo di questi contenuti, richiedilo
direttamente te allo stesso webservice che viene consumato dal JS...
bye!

 suggerimento il resto del discorso resta valido.
no scusa effettivamente rileggendo è probabile che abbia ragione tu e
abbia frainteso io..

rifare lo scraping..
Credo sia propio così, per questo lo ritengo troppo laborioso :)
Alex

 No JS non viene eseguito, come potrebbe ?
Portandosi dietro un intero motore javascript nel bot (vedi webkit)
Ma anche in quel caso, l'unico evento che potresti far eseguire al motore 
è l'onload della pagina, di certo non puoi simulare click e simili.
Quindi siamo abbastanza sull'inutile andante.

 Quindi siamo abbastanza sull'inutile andante.
Il click lo puoi emulare con imacros + firefox, ma ripeto, credo sia
un bagno di sangue installarlo e fare il tutto da linea di comando (io
ero riuscito, dopo veri tentativi, a lanciare firefox da php per
convertire html in pdf, prima di scoprire wkhtmltopdf: funzionare
funzionava, ma credimi che non era la cosa più stabile del moendo)

 noterai delle differenze.
E' proprio per i motivi finora elencati che google pubblica i suoi 
contenuti anche tramite delle API ;-)
Anche se va detto che non sempre lo fa e altri lo fanno anche più 
raramente; ad esempio per il link che citi le API ufficiali non esistono.
 > No JS non viene eseguito, come potrebbe ?
Dal tuo primo post ero convinto che il problema fosse a valle, dopo 
l'esecuzione di JS, non tanto nella mancata esecuzione del codice 
stesso. Questo è un problema risolvibile: ci sono parecchie librerie con 
il supporto per JS.
Purtroppo ne conosco solo per Java e Python, non mi è mai capitato di 
aver bisogno di queste funzionalità da PHP. Sicuramente altri potranno 
consigliarti meglio.

 consigliarti meglio.
:)
Mi hai dato ottimi consigli non credere...
Cmq sono impazzito un giorno intero per capire perchè una colonna di
link non risultasse, "Diavolo eppure sono li li vedo...."
Bhè è finita bene perche a questo link c'è tutto quello che mi serviva
e non c'è JS stavolta a "combinare guai"....
http://www.google.com/trends/hottrends?sa=X
Grazie a tutti
Alex