Τετάρτη 21 Ιανουαρίου 2015

Απώλεια δεδομένων (Python)

Τώρα πρόσφατα δουλεύω σε ένα web spider σε Python με Tornado. Αρχικά για όσους δεν γνωρίζουν τι είναι μια αράχνη στο Διαδίκτυο , είναι ένα bot (robot) το οποίο επισκέπτεται μια ιστοσελίδα μαζεύει όλα τα δεδομένα που βρίσκει και στην συνέχεια εκτελεί την ίδια διαδικασία στα links που έχει βρει στην σελίδα κατά την συλλογή των δεδομένων .

Σε τι χρησιμεύει όμως αυτό ; Εταιρίες όπως η Google έχουν τις αράχνες τους με τις οποίες συλλέγουν δεδομένα τα οποία παρουσιάζουν στον χρήστη όταν αναζητεί κάτι .

Περισσότερες πληροφορίες μπορούν να βρεθούν εδώ : http://en.wikipedia.org/wiki/Web_crawler

Το πρόβλημα, όμως στον crawler που γράφω εγώ , είναι ότι άνοιγε συνέχεια links και πολλές ιστοσελίδες μετά από αρκετά requests έπαυαν να ανταποκρίνονται και μου έδιναν 404 και 503 status codes με αποτέλσμα κάποια δεδομένα να χάνονται .

Δοκιμάζοντας μερικές εντολές στo shell της mongodb
>db.lists.count() 
1626 
>db.urls.count() 
4055
όπου οι lists είναι η συλλογή (δεδομένων-ιστοσελίδας) ενω urls η συλλογή των συνδέσμων στους οποίους είχε δοκιμαστεί να γίνει crawling παρατηρόυμε ότι έχουμε μια τεράστια απώλεια (> 1/2) . Το πρόβλημα το αντιμετώπισα προσθέτωντας ένα exception:

except urllib2.HTTPError: 
    if not (len(queue_item) > 2): 
        self.queue.put((self.current_url, self.depth, 1)) 

το οποίο προσθέτει το url πάλι στην σειρά και αυτή την φορά θα περιμένει 1 δευτερόλεπτο πριν το ανοίξει .

Δευτέρα 12 Ιανουαρίου 2015

Βελτιστιοποίηση (Python)

Πριν δυό βδομάδες δούλευα μαζί με ένα φίλο σχετικά με ένα log manager σε Python
και είχαμε το εξής πρόβλημα . Κάθε φορά που ένας χρήστης πατάει το refresh πρέπει να γίνεται ένα ajax get request το οποίο θα επιστρέφει τις αλλαγές που συνέβησαν στο αρχείο . 
Ο κώδικας ήταν ο εξής :


diffs = differ.compare(files_cache[file_name], log_file.read())
diff_l = [diff for diff in diffs if re.search(diff_regex, diff)]
file_diffs[file_name] = "".join(diff_l)

Ο οποίος έπαιρνε τις αλλαγές και τις σύγκρινε εάν ξεκινάνε με "+" ή " " :
Επειδή με το  difflib της python επιστρέφονται και οι γραμμές που δεν έχουν αλλάξει ο έλεγχος αυτός έπαιρνε γύρω στα 11 λεπτά .

Όμως κάποιος ο οποίος θα σκεφτόταν ότι ένα log αρχείο έχει ΜΟΝΟ additions γιατί λοιπόν να κάτσεις να το διαβάσεις όλο και να μην ξεκινήσεις από εκεί που σταμάτησες ;

file_diffs[file_name] = file_contents[len(files_cache[file_name]):]

Χρόνος εκτέλεσης : 0,0001 s