akenaton Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 Καλησπέρα Γενική περιγραφή: έχω μια βάση δεδομένων και θέλω να την ενημερώνω ανα τακτά χρονικά διαστήματα με δεδομένα που θα αντλώ απο συγκεκριμένη σελίδα του web. Σκεφτείτε μια απλή html σελίδα sto web με tables και links που παραπέμπουν σε άλλα tables και ενημερώνονται με κάποιο μαγικο τροπο συχνά πυκνά. Εγώ θέλω να φτιάξω ένα προγραμματάκι που θα δουλεύει σαν crawler σε όλο το site αυτό και πηγαίνοντας απο σελίδα σε σελίδα θα παίρνει συγκεκριμένα δεδομένα και θα ενημερώνει μια δική μου βάση δεδομένων. Θα ήθελα να ρωτήσω, με ποιον τρόπο θα μπορούσε να υλοποιηθεί ευκολότερα κάτι τέτοιο. Οι γνώσεις μου όσο αφορά τις γλώσσες προγραμματισμού περιορίζονται σε C/C++ και Java, αλλά είμαι ανοιχτός στο να ασχοληθώ και με άλλες γλώσσες ή τεχνολογίες αν χρειαστεί. Ψάχνω για μεθόδους, βιβλιοθήκες, ιδέες που θα μπορούσαν να με βοηθήσουν σε κάτι τέτοιο. Η όλη ιδέα οτι πρέπει να κατεβάζω και να κάνω parse σε C κώδικα 7-8 διαφορετικούς τύπους σελίδων με τρομάζει Ευχαριστώ εκ των προτέρων.
Aesmade Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 Μπορείς να δοκιμάσεις 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) και να κάνεις κάτι παρόμοιο.
alex2005 Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 Νομίζω ότι για αυτό που θέλεις καλύτερα να ξεχάσεις την 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 από σελίδες και μετά να τραβάει πληροφορίες.
akenaton Δημοσ. 26 Ιουνίου 2008 Μέλος Δημοσ. 26 Ιουνίου 2008 Έχω την αίσθηση πως το δυσκολότερο κομμάτι είναι αυτό του parsing. Χμμ... όχι δυσκολότερο αλλα πιο κουραστικό. Αναρωτιέμαι σε τι ποσοστό η επιλογή της γλώσσας που θα χρησιμοποιήσω μπορεί να παίξει κάποιο ρόλο ώστε να κάνει το όλο εγχείρημα ευκολότερο. Μήπως πρέπει να προσανατολιστώ σε κάποια scripting γλώσσα (π.χ. python/perl); Για να μην γενικολογούμε (αν και με ενδιαφέρει γενικότερα το ζήτημα), η σελίδα απο την οποία θέλω να αντλήσω δεδομένα είναι αυτή: http://travutils.com/?s=gr1 Ευχαριστώ για το feedback
Aesmade Δημοσ. 26 Ιουνίου 2008 Δημοσ. 26 Ιουνίου 2008 Ένα παράδειγμα σε 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 ενώ ψάχνεις τα δεδομένα που θες σε κάθε σελίδα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.