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

Extract data from html


akenaton

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

Δημοσ.

Καλησπέρα

 

Γενική περιγραφή: έχω μια βάση δεδομένων και θέλω να την ενημερώνω ανα τακτά χρονικά διαστήματα με δεδομένα που θα αντλώ απο συγκεκριμένη σελίδα του web.

 

Σκεφτείτε μια απλή html σελίδα sto web με tables και links που παραπέμπουν σε άλλα tables και ενημερώνονται με κάποιο μαγικο τροπο συχνά πυκνά. Εγώ θέλω να φτιάξω ένα προγραμματάκι που θα δουλεύει σαν crawler σε όλο το site αυτό και πηγαίνοντας απο σελίδα σε σελίδα θα παίρνει συγκεκριμένα δεδομένα και θα ενημερώνει μια δική μου βάση δεδομένων.

Θα ήθελα να ρωτήσω, με ποιον τρόπο θα μπορούσε να υλοποιηθεί ευκολότερα κάτι τέτοιο. Οι γνώσεις μου όσο αφορά τις γλώσσες προγραμματισμού περιορίζονται σε C/C++ και Java, αλλά είμαι ανοιχτός στο να ασχοληθώ και με άλλες γλώσσες ή τεχνολογίες αν χρειαστεί. Ψάχνω για μεθόδους, βιβλιοθήκες, ιδέες που θα μπορούσαν να με βοηθήσουν σε κάτι τέτοιο. Η όλη ιδέα οτι πρέπει να κατεβάζω και να κάνω parse σε C κώδικα 7-8 διαφορετικούς τύπους σελίδων με τρομάζει :-)

 

Ευχαριστώ εκ των προτέρων.

Δημοσ.

Μπορείς να δοκιμάσεις visual basic, το WebBrowser control που έχει είναι πανεύκολο να το χρησιμοποιήσεις (δεν το έχω δοκιμάσει ο ίδιος, αλλά έχω δει αρκετούς νουμπάδες να το χρησιμοποιούν και να νομίζουν ότι έφτιαξαν browser). Απο εκεί μπορείς να κάνεις shtml = WebBrowser1.Document.documentElement.outerHTML (και πάλι, δεν το έχω δοκιμάσει αλλά πρέπει να λειτουργεί). Μετά βρίσκεις κάθε a tag (<a href="link"> είναι το tag για links), παίρνεις το href και το ψάχνεις και αυτό και με λίγη recursion έγινε το πράμα. Αλλιώς μπορείς να χρησιμοποιήσεις την file_get_contents της php (http://gr2.php.net/file_get_contents) και να κάνεις κάτι παρόμοιο.

Δημοσ.

Νομίζω ότι για αυτό που θέλεις καλύτερα να ξεχάσεις την C/C++ καθώς (κατά την άποψή μου) αυτό είναι καλύτερα υλοποιήσιμο σε Java. (Έχω κάνει πρόσφατα κάτι σχεδόν ίδιο με αυτό που κάνεις)

 

Για crawler θα βρεις αρκετές λύσεις στο net αν ψάξεις.

Ρίξε μία ματιά γενικά για crawlers σε Java εδώ:

 

http://java.sun.com/developer/technicalArticles/ThirdParty/WebCrawler/

 

Μετά από αυτό απλά ψάξε στο google και θα βρεις έτοιμες λύσεις.

 

Όσο αναφορά το extracting πληροφοριών από HTML κώδικες.

 

Πρώτον πρέπει να μελετήσεις όλες τις σελίδες και να δεις πως μπορείς να αντλήσεις τις πληροφορίες που θέλεις.Αυτό είναι το πιο δύσκολο κομμάτι καθώς μπορεί η κάθε σελίδα τους να έχει διαφορετικό format.

Σκέψου αν αυτή η σελίδα που θέλεις να τραβήξεις πληροφορίες παρέχει rss feeds για αυτά που θέλεις να διαβάσεις (λέω εγώ τώρα).Σε αυτήν την περίπτωση είναι καλύτερο να διαβάζεις τα feeds παρά τις ίδιες σελίδες,τα οποία θα είναι σε .xml μορφή που μπορείς εύκολα να κάνεις parse.

 

Αν δεν παίζει η δυνατότητα του rss μπορείς να ψάξεις για HTML parsers στην Java που υπάρχουν πολλοί.

 

Στην θέση σου και για τις δύο δουλειές (crawler,parsing(αν δεν παίζουν rss)) θα χρησιμοποιούσα regex καθώς δεν είναι και ιδιαίτερα δύσκολο να φτιάξεις έναν mini parser που να διαβάζει link από σελίδες και μετά να τραβάει πληροφορίες.

Δημοσ.

Έχω την αίσθηση πως το δυσκολότερο κομμάτι είναι αυτό του parsing. Χμμ... όχι δυσκολότερο αλλα πιο κουραστικό. Αναρωτιέμαι σε τι ποσοστό η επιλογή της γλώσσας που θα χρησιμοποιήσω μπορεί να παίξει κάποιο ρόλο ώστε να κάνει το όλο εγχείρημα ευκολότερο. Μήπως πρέπει να προσανατολιστώ σε κάποια scripting γλώσσα (π.χ. python/perl);

Για να μην γενικολογούμε (αν και με ενδιαφέρει γενικότερα το ζήτημα), η σελίδα απο την οποία θέλω να αντλήσω δεδομένα είναι αυτή: http://travutils.com/?s=gr1

 

Ευχαριστώ για το feedback

Δημοσ.

Ένα παράδειγμα σε php (που είναι και scripting language) που βρίσκει όλα τα links σε μια σελίδα:

>
<?php
function getlinks($url) {
$content=file_get_contents($url);
preg_match_all("|<a href=\"?'?(.*)[^\"'][\"']|U",$content,$links,PREG_PATTERN_ORDER);
foreach ($links[0] as &$sl) {
$sl=substr($sl,9,strlen($sl)-10);
if (!preg_match("/http:\/\//",$sl))
$sl=substr($url,0,strlen($url)-strlen(strrchr($url,'/'))).$sl;
echo $sl."<br />";
}
}
getlinks("http://travutils.com/?s=gr1");
?>

Αν θες μπορείς αντί να κάνεις echo το κάθε link να ξανακαλέσεις τη getlinks recursively ενώ ψάχνεις τα δεδομένα που θες σε κάθε σελίδα.

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

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

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