Πώς να ξύνω τα δεδομένα από μια ιστοσελίδα

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

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

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

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

Θα χρησιμοποιήσουμε τη γλώσσα προγραμματισμού Python για απόρριψη δεδομένων επειδή:

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

Η Python έρχεται προεγκατεστημένη στο Mac OS X αλλά για χρήστες των Windows, θα πρέπει να την εγκαταστήσετε μέσω της επίσημης ιστοσελίδας. Θα χρησιμοποιήσουμε το Python2.

Προϋπόθεση για την απόσπαση δεδομένων από ιστότοπους είναι η βασική γνώση της HTML. Το HTML είναι η τυπική γλώσσα σήμανσης για τη δημιουργία ιστοσελίδων και χρησιμοποιείται για τον καθορισμό δομών περιεχομένου σε ιστοσελίδες. Πρέπει να καταλάβετε πώς αυτά τα περιεχόμενα είναι δομημένα ώστε να είναι σε θέση να γνωρίζουν πού και πώς να τα αποκτήσουν.
Μπορείτε να πάρετε ένα γρήγορο μάθημα εισαγωγής HTML στο W3Schools εάν χρειάζεστε μια ανανέωση.

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

Ας ρίξουμε μια ματιά στις βιβλιοθήκες που θα χρησιμοποιήσουμε για την απόξεση:

  1. Jupyter Notebook - Το Jupyter Notebook είναι μια εφαρμογή web ανοιχτού κώδικα που σας επιτρέπει να δημιουργείτε και να μοιράζεστε έγγραφα που περιέχουν ζωντανό κώδικα, εξισώσεις, οπτικοποιήσεις και κείμενο αφήγησης. Θα μοιραστώ τον κώδικα που χρησιμοποιείται σε αυτό το σεμινάριο μέσω ενός Jupyter Notebook που φιλοξενείται στο Github!
  2. αιτήσεις - αυτή η βιβλιοθήκη κάνει την αντιμετώπιση των αιτήσεων HTTP απλή. Γιατί πρέπει να αντιμετωπίζετε αιτήματα HTTP; Επειδή είναι αυτό που το πρόγραμμα περιήγησης ιστού στέλνει στο παρασκήνιο όταν θέλει να ανακτήσει μια σελίδα από το διαδίκτυο.
  3. BeautifulSoup - Αυτή είναι μια βιβλιοθήκη Python που χειρίζεται την εξαγωγή των σχετικών δεδομένων από HTML και XML. Μπορείτε να διαβάσετε περισσότερα σχετικά με την εγκατάσταση και πώς να χρησιμοποιήσετε το BeautifulSoup εδώ.

Στη συνέχεια, πρέπει να αποκτήσουμε τη βιβλιοθήκη BeautifulSoup χρησιμοποιώντας το εργαλείο διαχείρισης πακέτων Python γνωστό ως pip.

Στο τερματικό (ή γραμμή εντολών για χρήστες των Windows), πληκτρολογήστε:

pip εγκαταστήσετε τις αιτήσεις BeautifulSoup4

Ορισμένοι κανόνες που πρέπει να ληφθούν υπόψη πριν από την απόξεση:

  1. Πρέπει να ελέγξετε τους Όρους και τις Προϋποθέσεις ενός ιστότοπου, προτού το ξεγελώσετε. Προσέξτε να διαβάσετε τις δηλώσεις σχετικά με τη νόμιμη χρήση των δεδομένων. Συνήθως, τα δεδομένα που ξύνετε δεν πρέπει να χρησιμοποιούνται για εμπορικούς σκοπούς.
  2. Μην ζητάτε δεδομένα από τον ιστότοπο πολύ επιθετικά με το πρόγραμμά σας (επίσης γνωστό ως spamming), καθώς αυτό μπορεί να σπάσει τον ιστότοπο. Βεβαιωθείτε ότι το πρόγραμμά σας συμπεριφέρεται με λογικό τρόπο (δηλαδή ενεργεί σαν άνθρωπος). Ένα αίτημα για μια ιστοσελίδα ανά δευτερόλεπτο είναι καλή πρακτική.
  3. Η διάταξη μιας ιστοσελίδας μπορεί να αλλάζει κατά διαστήματα, οπότε βεβαιωθείτε ότι θα επισκεφθείτε ξανά το site και θα ξαναγράψουμε τον κωδικό σας όπως είναι απαραίτητο.

Μπορείτε να διαβάσετε περισσότερα για τη δεοντολογία της απομάκρυνσης δεδομένων εδώ

Αποσυναρμολόγηση μιας ιστοσελίδας

Σε αυτό το σεμινάριο, θα αποκομίζουμε το προσωπικό μου blog για δημοσιεύσεις. Θέλουμε να φέρουμε όλες τις διαθέσιμες θέσεις στο blog. Ο σύνδεσμος είναι διαθέσιμος εδώ.

Σελίδα προορισμού για το προσωπικό μου blog

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

Πώς να επιθεωρήσετε μια ιστοσελίδα

Μόλις κάνετε κλικ, θα πρέπει να δείτε ένα μίνι-παράθυρο στο πρόγραμμα περιήγησής σας ανοικτό και εκεί θα πρέπει να δείτε τη δομή HTML της σελίδας που βρίσκεστε. Ακολουθεί ένα στιγμιότυπο οθόνης για το πώς μοιάζει η δομή του ιστολογίου μου.

επιθεώρηση της διάταξης για τις θέσεις

Μετά από σωστή εξέταση, ανακάλυψα ότι όλες οι αναρτήσεις ιστολογίου μου στεγαζόταν σε div με όνομα κλάσης, post-feed. Τώρα που έχουμε αυτές τις πληροφορίες ας αρχίσουμε να γράφουμε κώδικα.

Θα χρησιμοποιήσω τον Jupyter όπως είπα νωρίτερα, μπορείτε να αποφασίσετε να γράψετε τον κώδικα σας σε σενάρια και να τα εκτελέσετε χειροκίνητα. Λατρεύω το γεγονός ότι τα Jupyter Notebooks σας επιτρέπουν να εκτελέσετε τον κώδικα σας σε κελιά.

Πρώτον, ας εισαγάγουμε τις βιβλιοθήκες που θα χρησιμοποιήσουμε σε αυτό το σεμινάριο.

αιτήματα εισαγωγής
από την εισαγωγή bs4 BeautifulSoup

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

Στη συνέχεια, ας υποβάλετε ένα αίτημα και να πάρετε το HTML του ιστολογίου μου.

url = requests.get ('https://bolajiolajide.github.io')

Ο λόγος που το κάνουμε είναι επειδή πρέπει να μιμηθούμε ένα αίτημα του προγράμματος περιήγησης για να λάβουμε πληροφορίες από τη διεύθυνση URL. Γενικά, όταν επισκέπτεστε τις διευθύνσεις URL από τα προγράμματα περιήγησης, αυτό που πραγματικά κάνουμε είναι να κάνετε HTTP αιτήματα στη διεύθυνση URL.

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

πηγή = BeautifulSoup (url.text, 'html.parser')

Πέρασα url.text αντί για url επειδή θέλουμε μόνο να αναλύσουμε το τμήμα HTML της απάντησης στο BeautifulSoup. Τώρα που έχουμε ένα αντικείμενο BeautifulSoup, μπορούμε να το χειριστούμε χρησιμοποιώντας τις γνώσεις μας για τη διάταξη της ιστοσελίδας για να έχουμε τα δεδομένα που χρειαζόμαστε.

Το BeautifulSoup μπορεί να μας βοηθήσει να μπείτε σε βαθιά HTML επίπεδα και να εξαγάγουμε το περιεχόμενο με find (). Θυμηθείτε, αφού επιθεωρήσαμε την ιστοσελίδα, ανακαλύψαμε ότι όλα τα άρθρα του ιστολογίου φιλοξενούνται σε ένα div με μια τάξη post-feed. Σε αυτή την περίπτωση, επειδή η κλάση HTML είναι μοναδική σε αυτή τη σελίδα, μπορούμε απλώς να ερωτήσουμε την

.

Για να γίνει αυτό με τη μέθοδο εύρεσης του BeautifulSoup, απλά θα ζητούσαμε τη μεταβλητή προέλευσης μας καθορίζοντας τι χρειαζόμαστε.

post_feed = source.find ('div', class _ = "post-feed")

Τώρα έχουμε όλα τα άρθρα μας (το markup τους, lol) αποθηκευμένα στη μεταβλητή post-feed. Στη συνέχεια, ας επιθεωρήσουμε τα μεμονωμένα άρθρα για να πάρουμε τον συγγραφέα, τον τίτλο και το απόσπασμα του άρθρου.

post = post_feed.find_all ('άρθρο', κατηγορία _ = 'μετά την κάρτα')

Αυτό που κάναμε εδώ χρησιμοποιείται η μέθοδος find_all για να πάρουμε όλες τις εμφανίσεις του άρθρου ετικέτας με μια κλάση post-card.

Η απάντηση θα είναι η σήμανση για τα μεμονωμένα άρθρα στο blog. Αυτό που έκανα ήταν να αναλύσω προσεκτικά ένα μόνο άρθρο και να αποκτήσω τον συγγραφέα, τον τίτλο και το απόσπασμα. Αργότερα, θα γράψω μια λειτουργία για να κάνω το ίδιο και για τα άλλα άρθρα, έτσι δεν επαναλαμβάνω τον εαυτό μου. Έχω φιλτράρει την πρώτη θέση και την αναθέσατε σε μια μεταβλητή, single_post.

single_post = δημοσιεύσεις [0]

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

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

  • ο τίτλος της θέσης είναι τυλιγμένος σε ένα στοιχείο h2 με μια κλάση post-card-title.
  • το απόσπασμα της θέσης είναι τυλιγμένο σε μια ετικέτα p που είναι ενωμένη μέσα σε ένα στοιχείο διατομής με ένα απόσπασμα μετά την κάρτα.
  • το όνομα του συγγραφέα είναι τυλιγμένο σε μια ετικέτα ενωμένη σε ένα στοιχείο span με τον συγγραφέα post-card class.
Ελέγξτε τον τίτλο της ανάρτησηςΕλέγξτε το απόσπασμα της θέσηςΕπιθεώρηση του συντάκτη της θέσης

Ένα από τα χαρακτηριστικά του BeautifulSoup είναι ότι μπορεί να σκάψει τις ετικέτες HTML ανεξάρτητα από το πόσο βαθιά είναι ένθερμοι.

Αυτό σημαίνει ότι μπορούμε να βρούμε τις ετικέτες που περιέχουν τον συντάκτη, τον τίτλο και το απόσπασμα της ανάρτησης χωρίς να χρειάζεται να σκάβουμε βαθύτερα.

Ας ξεκινήσουμε με τον τίτλο της θέσης, είναι τυλιγμένο σε ένα στοιχείο h2 με τίτλο post-card-title.

Μπορούμε απλώς να το φέρουμε χρησιμοποιώντας τη μέθοδο εύρεσης στην ενιαία θέση που έχουμε φιλτράρει.

title = single_post.find ('h2', class _ = 'post-card-title')

Αυτό θα επιστρέψει το markup όπως είναι. Αφού θέλουμε μόνο το κείμενο μέσα στην ετικέτα h2, μπορούμε να το στοχεύσουμε με .text.

title = title.text

title.text μας δίνει τον τίτλο στο κείμενο χωρίς τη σήμανση.

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

Δεδομένου ότι ένα στοιχείο p είναι ένθετο μέσα του, απλώς θα στοχεύσαμε το κείμενο του στοιχείου p με τον ίδιο τρόπο που στοχεύσαμε το κείμενο μέσα στον τίτλο.

απόσπασμα = single_post.find ('τμήμα', τάξη _ = "απόσπασμα μετά την κάρτα")
απόσπασμα = excerpt.p.text

Τέλος, πρέπει να βρούμε τον συγγραφέα του άρθρου, αφού το όνομα του συντάκτη είναι τυλιγμένο σε ένα στοιχείο που είναι τυλιγμένο μέσα σε ένα στοιχείο span με τον συγγραφέα post-card class, απλά στοχεύουμε το στοιχείο span και παίρνουμε το κείμενο του παιδιού που είναι ένα στοιχείο.

author = single_post.find ('span', class _ = 'post-card-author')
author = author.a.text

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

def get_post_details (άρθρο):
    title = article.find ('h2', class _ = 'post-card-title')
    απόσπασμα = article.find ('τμήμα', κατηγορία _ = 'απόσπασμα μετά την κάρτα'). p.text
    author = article.find ('span', class _ = 'post-card-author')
    ΕΠΙΣΤΡΟΦΗ {
        "τίτλος": τίτλος,
        "απόσπασμα": απόσπασμα,
        "συγγραφέας": συγγραφέας
    }}

Επιστρέφω τις πληροφορίες ως αντικείμενο, έτσι κάθε θέση αντιπροσωπεύεται από ένα αντικείμενο.

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

Μπορείτε να χρησιμοποιήσετε μια κατανόηση λίστας για να πάρετε τις λεπτομέρειες για κάθε θέση

# Χρήση κατανόησης λίστας αντί για βρόχους
blog_posts = [get_post_details (δημοσίευση) για δημοσίευση σε αναρτήσεις].

ή χρησιμοποιώντας για βρόχο να βγάλει σε κάθε θέση και να περάσει το markup στη λειτουργία:

blog_posts = []
για δημοσίευση σε θέσεις:
    blog_posts.append (get_post_details (ανάρτηση))

Οι λεπτομέρειες για κάθε ανάρτηση θα επισυνάπτονται στα αρχεία blog_posts.

Έχουμε φτάσει στο τέλος αυτού του σεμιναρίου, έχω την ελευθερία να επισυνάψω ένα σημειωματάριο Jupyter ως συστατικό σε αυτό το post ώστε να μπορείτε να περάσετε μέσα στον ελεύθερο χρόνο σας.

Η απόξεση είναι πραγματικά εύκολη και διασκεδαστική! ♂

Αν σας άρεσε αυτό το άρθρο, παρακαλώ για αυτό και να μοιραστείτε. Θα το εκτιμούσα πραγματικά.

Εάν έχετε οποιεσδήποτε ερωτήσεις, μπορείτε να αφήσετε ένα σχόλιο παρακάτω.

Σας ευχαριστώ!