Προς το περιεχόμενο

Λήψη περιεχομένου από ιστοσελίδα που χρησιμοποιεί javascript...


clairvoyant

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

Ας υποθέσουμε ότι έχουμε μια σελίδα, της οποίας τα περιεχόμενα ενός πίνακα παίρνουν τιμές με χρήση javascript. Αυτό που θέλω να κάνω είναι με κάποιο προγραμματιστικό τρόπο να συνδέομαι στη σελίδα και να αποθηκεύω τις τιμές αυτές. Απ' ότι καταλαβαίνω, δεν έχει νόημα να αναζητώ τις τιμές στον κώδικα της σελίδας, αφού αυτές φορτώνονται δυναμικά. Μπορώ να κάνω κάτι; Θα ήθελα γενικές και ειδικές συμβουλές επί του θέματος (δηλ. ναι μεν ποια γλώσσα να χρησιμοποιήσω, με προτίμηση μία από τις Java & Delphi, αλλά και λίγο ειδικότερα πως θα γίνει αυτό που θέλω να κάνω).

 

Οποιαδήποτε συμβουλή καλοδεχούμενη γιατί έχω κολλήσει άγρια... Α, να μην το ξεχάσω, η σελίδα βρίσκεται σε διαδικτυακό τόπο και όχι στον υπολογιστή μου (ένα site είναι με λίγα λόγια), και δεν έχω την παραμικρή ιδέα του τι ακριβώς συμβαίνει στον server...

Δημοσ.
ti ennoeis otan les "ta periexomena enos pinaka" ? Boreis na gineis ligo pio safis, isws me ena paradeigma?

Θα προσπαθήσω.. Η σελίδα, απ' ότι καταλαβαίνω, χρησιμοποιεί πίνακες για την εμφάνιση κάποιων στοιχείων. Το κλασικό

 

<table>

<td>

<tr>...</tr>

</td>

</table>

 

(Μπορεί να έγραψα ανάποδα τα <td> και <tr>, έχει σκουριάσει και η HTML στο μυαλό μου). Ε κάπου εκεί στα κελιά, οι τιμές δεν είναι στατικές αλλά ανανεώνονται διαρκώς από ένα javascript. Κάτι σαν τιμές μετοχών φαντάσου. Εγώ πως στο καλό θα διαβάσω αυτές τις τιμές;

 

Βασικά, επειδή μου αρέσει πάντα να κάνω τα πράγματα με τον πλέον εύκολο (ή και μπακάλικο!) τρόπο, και επειδή η σελίδα μου φαίνεται χάος από άποψη δομής, σκέφτηκα μια εναλλακτική λύση: μήπως είναι πιο εύκολο να βάλω σε μια γλώσσα προγραμματισμού ένα control το οποίο θα λειτουργεί όπως ο Internet Explorer (ActiveX control λέγεται αυτό ή κάνω λάθος; ), και αφού ανοίξει η σελίδα και εμφανιστεί κανονικά, μετά θα καλώ π.χ. μια κλήση myControl.selectAllText() [υποθετικά το έγραψα] και αφού πάρω το κείμενο θα εντοπίζω εκεί τις τιμές που θέλω; Ακόμη και αυτή η λύση με καλύπτει απόλυτα, οπότε αν είναι εφικτή θα ήθελα μια μικρή καθοδήγηση ως προς το πως θα το κάνω (επαναλαμβάνω, καλύτερα με Java ή Delphi. Από ικανότητα διαχείρισης κειμένου τα πάω καλά στη C++ αλλά με τις Visual C++/C# έχω μαύρα μεσάνυχτα).

Δημοσ.

Diladi thes ana takta diastimata na pairneis tis times apo tin selida? xmmmm. Efoson den boreis na tis pareis apo to "service" pou dinei tis times sto html, prepei ontws mesw enos socket connection, na pairneis tin selida ana px 2 lepta, na kaneis parsing kai na briskeis tis times. Auto ginetai kai me java kai me delphi.

Δημοσ.

το έκανα (μπακαλίστικα όπως πάντα), με τη βοήθεια του TWebControl (Delphi). Βέβαια η λύση που προτείνεις εσύ προφανώς θα έχει περισσότερα πλεονεκτήματα, όμως υπάρχει πίεση χρόνου οπότε..!

 

Ευχαριστώ πάντως :)

Δημοσ.

Ομολογώ ότι μπερδεύτηκα. Η JavaScript είναι client-side γλώσσα, επομένως δε μπορεί να σε εμποδίσει να διαβάσεις τη σελίδα. Για να διαβάσεις όλο τον HTML κώδικα της σελίδας με JavaScript ένας τρόπος είναι ο εξής:

 

>var s = document.documentElement.innerHTML

Θα πεις τώρα, πώς θα τρέξω αυτό τον κώδικα? Μία ιδέα είναι τα bookmarklets ή το Greasemonkey, αλλά θα υπάρχουν κι άλλοι. Πάντως με Delphi, C++, VB κ.λπ. δε νομίζω να καταφέρεις τίποτα, γιατί είναι υπόθεση scripting.

 

Για να κατεβάσεις τον κώδικα μιας σελίδας προγραμματιστικά με Java ή JScript, μπορείς να δεις εδώ.

Δημοσ.
Ομολογώ ότι μπερδεύτηκα. Η JavaScript είναι client-side γλώσσα, επομένως δε μπορεί να σε εμποδίσει να διαβάσεις τη σελίδα.

Κατά πάσα πιθανότητα, έχεις δίκιο. Η σελίδα ναι μεν χρησιμοποιεί javascripts σε πολλά σημεία, όμως τελικά από πίσω χρησιμοποιεί και JSP, ή κάτι τέτοιο (δεν έχω ιδέα περί τίνος πρόκειται.. φαντάζομαι κάτι παρόμοιο με το ASP που επίσης δεν γνωρίζω). Οπότε, υποθέτω πάλι, δεν μου αρκεί και δεν με βοηθά το να πάρω τον κώδικα της σελίδας. Με ενδιαφέρει να παίρνω το τελικό αποτέλεσμα.

 

Γι'αυτό μπόρεσα με τη Delphi, με λίγες γραμμές κώδικα, να λύσω το πρόβλημα μου: βάζω ένα Browser control, εμφανίζω κανονικά τη σελίδα, και έπειτα με μερικές κλήσεις έχω το κείμενο της το οποίο μπορώ να επεξεργαστώ. Αν, όμως, υπάρχει τρόπος να το κάνω αυτό σε Java, θα με βολέψει αρκετά περισσότερο καθώς θέλω να απαλλάξω πλήρως το χρήστη του προγράμματος από την ανάγκη να επισκέπτεται τη σελίδα μέσω ενός browser.

 

Ευχαριστώ πάντως πολύ και για το παράδειγμα Java για τη λήψη κώδικα, θα μου χρειαστεί και αυτό αν τελικά υλοποιήσω το πρόγραμμα σε Java :)

Δημοσ.

apo edw:

http://javaalmanac.com/egs/java.net/ReadFromURL.html?l=rel

 

try {

// Create a URL for the desired page

URL url = new URL("http://hostname:80/index.html");

 

// Read all the text returned by the server

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

String str;

while ((str = in.readLine()) != null) {

// str is one line of text; readLine() strips the newline character(s)

}

in.close();

} catch (MalformedURLException e) {

} catch (IOException e) {

}

Δημοσ.

Δυστυχώς το δοκίμασα χθες βράδυ και κατεβάζει τον κώδικα της σελίδας, όχι το αποτέλεσμα. Εγώ προφανώς ζητάω κάτι σαν "text only html browser" (Lynx ένα πράγμα).. επειδή όμως δεν νομίζω κάτι τέτοιο να γίνεται με λίγες γραμμές κώδικα, μάλλον συνεχίζω με τη Delphi.

Δημοσ.

Υποπτεύομαι ότι τα δεδομένα της σελίδας που σε ενδιαφέρει δεν βρίσκονται στον HTML κώδικα αλλά σε ένα συνοδευτικό αρχείο JavaScript (.js). Κάτι δηλαδή σαν αυτό:

 

>var acronym_list = new Array()
acronym_list.push("API;Application Programming Interface")
acronym_list.push("COM;Component Object Model")
acronym_list.push("ODBC;Open Database Connectivity")
acronym_list.push("OLE;Object Linking and Embedding")

Αν όντως συμβαίνει κάτι τέτοιο τότε πραγματικά η περίπτωσή σου είναι αξιοσημείωτη. Πάντως δεν πρέπει να είναι δύσκολο να αντλήσεις τις πληροφορίες που χρειάζεσαι από το script. Ένα αρχείο κειμένου είναι στο κάτω-κάτω.

 

Αν πάλι οι πληροφορίες βρίσκονται εν μέρει σε JavaScript και εν μέρει σε HTML, κι αν επιπλέον προκύπτουν υπολογιστικά, τότε τα πράγματα είναι πιο δύσκολα. :-|

Δημοσ.

clairvoyant: ma den einai dunaton. Katebazei ton kwdika html pou einai idios me ton kwdika html pou dixnei o browser. Xreiazesai diladi kati pera apo auto? Gia pes ksana ti akrivws ennoeis gia na katalaboume.

Δημοσ.

Σας μπέρδεψα έτσι; Λοιπόν σταμάτησα για λίγο τις ερωτήσεις, μέχρι να καταλάβω πλήρως πως λειτουργεί το site. Δεν θέλω να σας μπερδεύω χωρίς λόγο.

 

Έχω όμως μια αρκετά σαφή ερώτηση: μήπως γνωρίζετε τρόπο να εκτελέσω μια εντολή Javascript που υπάρχει σε μια σελίδα; Για παράδειγμα, υπάρχει ένα κουμπί που έχει onClick event μια μέθοδο doSomething(). Υπάρχει τρόπος να καλέσω αυτή τη μέθοδο; Εννοώ προγραμματιστικά! :roll:

Δημοσ.

Δηλαδή clairvoyant έχεις φορτώσει τη σελίδα στο browser και θέλεις να τρέξεις τη ρουτίνα doSomething() χωρίς να κάνεις κλικ στο κουμπί. Θέλεις ας πούμε να επιλέξεις ένα μενού του browser, να εμφανιστεί ένα message box, να γράψεις εκεί την εντολή doSomething() και ως εκ θαύματος να εκτελεστεί η εντολή στο φορτωμένη σελίδα, σαν να είχες πατήσει το κουμπί. Και περιμένεις δηλαδή από μένα να σου πω ότι κάτι τέτοιο γίνεται? Είμαστε σοβαροί?

 

Κι όμως γίνεται! Φτιάξε μία σελιδούλα που να έχει το παρακάτω link:

 

><html>
 <body>
   <a href="javascript:eval(prompt('Γράψτε την εντολή:'))">Εκτέλεση εντολής</a>
 </body>
</html>

Τρέξε τη σελίδα και κάνε δεξί κλικ στο link. Αν έχεις Firefox επέλεξε "Bookmark this link", ενώ αν έχεις IE επέλεξε "Add to favorites". Μόλις έφτιαξες ένα bookmarklet! Φόρτωσε τώρα τη σελίδα που σε ενδιαφέρει και βρες στο μενού του browser (bookmarks ή favorites) το bookmarklet που έφτιαξες. Γράψε την εντολή που θέλεις να εκτελεστεί.

 

Πάντως θα βοηθούσε να μας έδινες τη διεύθυνση της επίμαχης σελίδας για να την εξετάσουμε, για να μη μιλάμε στον αέρα. Εκτός κι αν είναι μυστικό οπότε πάσο. :-|

Δημοσ.

Gia Delphi:

 

procedure ExecuteScript(Doc: IHTMLDocument2; Script: string; Language: String);

var

Win: IHTMLWindow2;

Olelanguage: Olevariant;

begin

if Doc <> nil then

try

Win := Doc.ParentWindow;

if Win <> nil then

try

Olelanguage := Language;

Win.ExecScript(Script, Olelanguage);

finally

Win := nil;

end;

finally

Doc := nil;

end;

end;

 

 

procedure RunScript(JavaScript: String);

var

iDoc: IHTMLDocument2;

Web: IWebBrowser2;

begin

WebBrowser.Document.QueryInterface(IHTMLDocument2, iDoc);

ExecuteScript(iDoc, FJavaScript, 'javascript');

End;

 

To FWebBrowser einai to component TWebBrowser pou xrisimopoeis. H metabliti FJavaScript einai o kwdikas javascript pou thes.

 

Pigi: post apo tin Greek Delphi Programming List

(http://groups.yahoo.com/group/Greek_Delphi_Prog/)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...