Ένα σεμινάριο από το Semalt: Scraping Ιστού στο Python

Έχω επισκεφτεί πρόσφατα το KinoPoisk (ρωσική έκδοση του IMDB) και ανακάλυψα ότι με τα χρόνια κατάφερα να αξιολογήσω πάνω από 1000 ταινίες. Σκέφτηκα ότι θα ήταν ενδιαφέρον να ερευνήσω αυτά τα δεδομένα πιο λεπτομερή: έχουν αλλάξει τα γούστα της ταινίας μου με την πάροδο του χρόνου; Σε ποιες σεζόν του χρόνου παρακολουθώ περισσότερες ταινίες;

Αλλά πριν αναλύσουμε και δημιουργήσουμε όμορφα γραφικά, πρέπει να λάβουμε τα δεδομένα. Δυστυχώς, πολλές υπηρεσίες δεν έχουν δημόσιο API, οπότε πρέπει να τυλίξετε τα μανίκια σας και να αναλύσετε τις σελίδες html.

Αυτό το άρθρο προορίζεται για όσους ήθελαν πάντα να μάθουν πώς να χρησιμοποιούν το Web Scrapping, αλλά δεν πήραν τα χέρια τους ή δεν ήξεραν από πού να ξεκινήσουν.

Εργο

Η αποστολή μας είναι να εξαγάγουμε τα δεδομένα για τις ταινίες που έχουν ήδη δει: τον τίτλο της ταινίας, την ημερομηνία και την ώρα παρακολούθησης, την αξιολόγηση του χρήστη.

Στην πραγματικότητα, η δουλειά μας πρόκειται να γίνει σε 2 στάδια:

Στάδιο 1: λήψη και αποθήκευση σελίδων html

Στάδιο 2: ανάλυση ptml σε μορφή κατάλληλη για περαιτέρω ανάλυση (csv, json, pandas dataframe κ.λπ.)

Οργανα

Υπάρχουν πολλές βιβλιοθήκες python για την αποστολή αιτημάτων http. Το πιο διάσημο και πολύ βολικό είναι τα αιτήματα.

Είναι επίσης απαραίτητο να επιλέξετε μια βιβλιοθήκη για ανάλυση html.

BeatifulSoup, lxml

Αυτές είναι οι δύο πιο δημοφιλείς βιβλιοθήκες για την ανάλυση html και η επιλογή μιας από αυτές είναι απλώς μια προσωπική προτίμηση. Επιπλέον, αυτές οι βιβλιοθήκες συνδέονται στενά μεταξύ τους: Το BeautifulSoup άρχισε να χρησιμοποιεί το lxml ως εσωτερικό πρόγραμμα ανάλυσης για επιτάχυνση και σε lxml, προστέθηκε μια μονάδα supparser. Για να συγκρίνω τις προσεγγίσεις, θα αναλύσω τα δεδομένα με το BeautifulSoup και χρησιμοποιώντας τους επιλογείς XPath στην ενότητα lxml.html.

Λήψη δεδομένων

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

Ανοίγουμε το αρχείο που προκύπτει και βλέπουμε ότι δεν είναι τόσο απλό: ο ιστότοπος μας θεωρούσε ρομπότ και δεν θα εμφανίσει τα δεδομένα.

Ας μάθουμε πώς λειτουργεί ο ιστότοπος

Το πρόγραμμα περιήγησης δεν έχει κανένα πρόβλημα στη λήψη πληροφοριών από τον ιστότοπο. Ας δούμε πώς ακριβώς στέλνει το αίτημα. Για να το κάνουμε αυτό, χρησιμοποιούμε τον πίνακα "Δίκτυο" στο "Εργαλεία προγραμματιστή" στο πρόγραμμα περιήγησης (χρησιμοποιώ το Firebug για αυτό), συνήθως, το αίτημα που χρειαζόμαστε είναι το μεγαλύτερο.

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

Αυτή τη φορά είμαστε επιτυχημένοι και τώρα μας δίνονται τα απαραίτητα δεδομένα. Αξίζει να σημειωθεί ότι μερικές φορές ο ιστότοπος ελέγχει επίσης την εγκυρότητα του cookie, οπότε οι συνεδρίες στη βιβλιοθήκη αιτημάτων θα βοηθήσουν.

Λήψη όλων των τιμών

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

Συλλογή δεδομένων από Html

Τώρα ας πάμε απευθείας στη συλλογή των δεδομένων από το html. Ο ευκολότερος τρόπος για να κατανοήσετε πώς είναι δομημένη η σελίδα html είναι χρησιμοποιώντας τη λειτουργία "Επιθεώρηση στοιχείου" στο πρόγραμμα περιήγησης. Σε αυτήν την περίπτωση, όλα είναι αρκετά απλά: ολόκληρος ο πίνακας με τις τιμές βρίσκεται στην ετικέτα. Επιλέξτε αυτόν τον κόμβο:

από bs4 εισαγωγή BeautifulSoup

από lxml εισαγωγή html

# Όμορφη σούπα

σούπα = BeautifulSoup (κείμενο)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

tree = html.fromstring (κείμενο)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']') [0]

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

Εάν πρέπει να εξαγάγετε τον τίτλο στα αγγλικά απλώς αλλάξτε το "nameRus" σε "nameEng".

Αποτελέσματα

Μάθαμε πώς να αναλύσουμε ιστότοπους, εξοικειωθήκαμε με τις αιτήσεις βιβλιοθηκών, το BeautifulSoup και το lxml, καθώς και τα δεδομένα που λάβαμε κατάλληλα για περαιτέρω ανάλυση των ταινιών που έχουν ήδη δει στο KinoPoisk.