Ο απόλυτος οδηγός για το ξύσιμο με το Node.js

Λοιπόν, τι είναι το web scraping; Περιλαμβάνει την αυτοματοποίηση της επίπονης εργασίας της συλλογής πληροφοριών από ιστότοπους.

Υπάρχουν πολλές περιπτώσεις χρήσης για απόξεση ιστού: ίσως θελήσετε να συλλέξετε τιμές από διάφορους ιστότοπους ηλεκτρονικού εμπορίου για έναν ιστότοπο σύγκρισης τιμών. Ή ίσως χρειάζεστε ώρες πτήσεων και λίστες ξενοδοχείων / AirBNB για έναν ταξιδιωτικό ιστότοπο. Ίσως θέλετε να συλλέξετε μηνύματα ηλεκτρονικού ταχυδρομείου από διάφορους καταλόγους για δυνητικούς πελάτες, ή να χρησιμοποιήσετε δεδομένα από το Διαδίκτυο για να εκπαιδεύσετε μοντέλα μηχανικής μάθησης / AI. Ή θα μπορούσατε ακόμη και να θέλετε να δημιουργήσετε μια μηχανή αναζήτησης όπως το Google!

Το ξεκίνημα με το web scraping είναι εύκολο και η διαδικασία μπορεί να χωριστεί σε δύο κύρια μέρη:

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

Αυτός ο οδηγός θα σας καθοδηγήσει στη διαδικασία με τη δημοφιλή ενότητα ζήτησης-υπόσχεσης Node.js, CheerioJS και Puppeteer. Χρησιμοποιώντας τα παραδείγματα σε αυτόν τον οδηγό, θα μάθετε όλες τις συμβουλές και τα κόλπα που χρειάζεστε για να γίνετε επαγγελματίας στη συλλογή οποιωνδήποτε δεδομένων χρειάζεστε με το Node.js!

Θα συγκεντρώσουμε μια λίστα με όλα τα ονόματα και τα γενέθλια των προέδρων των ΗΠΑ από τη Wikipedia και τους τίτλους όλων των δημοσιεύσεων στην πρώτη σελίδα του Reddit.

Πρώτα πράγματα πρώτα: Ας εγκαταστήσουμε τις βιβλιοθήκες που θα χρησιμοποιήσουμε σε αυτόν τον οδηγό (Το Puppeteer θα χρειαστεί λίγη ώρα για να εγκατασταθεί καθώς χρειάζεται να κατεβάσει και το Chromium).

Υποβολή του πρώτου αιτήματός σας

Στη συνέχεια, ας ανοίξουμε ένα νέο αρχείο κειμένου (ονομάστε το αρχείο potusScraper.js), και γράψτε μια γρήγορη λειτουργία για να λάβετε το HTML της σελίδας «Λίστα Προέδρων» της Wikipedia.

Παραγωγή:

Χρήση Chrome DevTools

Ωραία, πήραμε το ακατέργαστο HTML από την ιστοσελίδα! Αλλά τώρα πρέπει να κατανοήσουμε αυτήν την τεράστια σταγόνα κειμένου. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε τα Chrome DevTools για να μας επιτρέπουν να αναζητούμε εύκολα μέσω του HTML μιας ιστοσελίδας.

Η χρήση του Chrome DevTools είναι εύκολη: απλώς ανοίξτε το Google Chrome και κάντε δεξί κλικ στο στοιχείο που θέλετε να αποκόψετε (σε αυτήν την περίπτωση κάνω δεξί κλικ στο George Washington, επειδή θέλουμε να λάβουμε συνδέσμους σε όλες τις σελίδες Wikipedia των μεμονωμένων προέδρων) :

Τώρα, απλώς κάντε κλικ στην επιλογή Επιθεώρηση και το Chrome θα εμφανίσει το παράθυρο DevTools, επιτρέποντάς σας να ελέγχετε εύκολα το HTML προέλευσης της σελίδας.

Ανάλυση HTML με το Cheerio.js

Φοβερό, το Chrome DevTools μας δείχνει τώρα το ακριβές μοτίβο που πρέπει να αναζητούμε στον κώδικα (μια "μεγάλη" ετικέτα με έναν υπερσύνδεσμο μέσα του). Ας χρησιμοποιήσουμε το Cheerio.js για να αναλύσουμε το HTML που λάβαμε νωρίτερα για να επιστρέψουμε μια λίστα με συνδέσμους στις μεμονωμένες σελίδες της Wikipedia των προέδρων των ΗΠΑ.

Παραγωγή:

Ελέγχουμε για να βεβαιωθούμε ότι επιστρέφονται ακριβώς 45 στοιχεία (ο αριθμός των προέδρων των ΗΠΑ), πράγμα που σημαίνει ότι δεν υπάρχουν επιπλέον κρυφές "μεγάλες" ετικέτες αλλού στη σελίδα. Τώρα, μπορούμε να περάσουμε και να πάρουμε μια λίστα με συνδέσμους και στις 45 προεδρικές σελίδες της Wikipedia λαμβάνοντας από την ενότητα "attribs" κάθε στοιχείου.

Παραγωγή:

Τώρα έχουμε μια λίστα με τις 45 προεδρικές σελίδες της Wikipedia. Ας δημιουργήσουμε ένα νέο αρχείο (με το όνομα potusParse.js), το οποίο θα περιέχει μια συνάρτηση για να πάρουμε μια προεδρική σελίδα Wikipedia και να επιστρέψουμε το όνομα και τα γενέθλια του προέδρου. Πρώτα πράγματα πρώτα, ας πάρουμε το ακατέργαστο HTML από τη σελίδα Wikipedia του George Washington.

Παραγωγή:

Ας χρησιμοποιήσουμε ξανά τα Chrome DevTools για να βρούμε τη σύνταξη του κώδικα που θέλουμε να αναλύσουμε, ώστε να μπορούμε να εξαγάγουμε το όνομα και τα γενέθλια με το Cheerio.js.

Βλέπουμε λοιπόν ότι το όνομα είναι σε μια τάξη που ονομάζεται "firstHeading" και τα γενέθλια είναι σε μια τάξη που ονομάζεται "bday". Ας τροποποιήσουμε τον κωδικό μας για να χρησιμοποιήσουμε το Cheerio.js για να εξαγάγουμε αυτές τις δύο κατηγορίες.

Παραγωγή:

Συνδυάζοντας τα όλα μαζί

Τέλειος! Τώρα ας το τυλίξουμε σε μια συνάρτηση και να το εξαγάγουμε από αυτήν την ενότητα.

Τώρα ας επιστρέψουμε στο αρχικό μας αρχείο potusScraper.js και χρειαζόμαστε τη μονάδα potusParse.js. Στη συνέχεια, θα το εφαρμόσουμε στη λίστα των wikiUrls που συλλέξαμε νωρίτερα.

Παραγωγή:

Απόδοση σελίδων JavaScript

Βόλα! Μια λίστα με τα ονόματα και τα γενέθλια και των 45 προέδρων των ΗΠΑ. Χρησιμοποιώντας μόνο τη μονάδα αιτήματος-υπόσχεσης και το Cheerio.js θα σας επιτρέψει να αποκόψετε τη συντριπτική πλειονότητα των ιστότοπων στο Διαδίκτυο.

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

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

Παραγωγή:

Δείτε πώς φαίνεται η έξοδος:

Χμμμ… όχι ακριβώς αυτό που θέλουμε. Αυτό συμβαίνει επειδή η λήψη του πραγματικού περιεχομένου απαιτεί να εκτελέσετε τη JavaScript στη σελίδα! Με το Puppeteer, αυτό δεν είναι πρόβλημα.

Το Puppeteer είναι μια εξαιρετικά δημοφιλής νέα ενότητα που σας έφερε η ομάδα του Google Chrome που σας επιτρέπει να ελέγχετε ένα πρόγραμμα περιήγησης χωρίς κεφάλι. Αυτό είναι ιδανικό για τη διαγραφή σελίδων μέσω προγραμματισμού που απαιτούν εκτέλεση JavaScript. Ας πάρουμε το HTML από την πρώτη σελίδα του Reddit χρησιμοποιώντας το Puppeteer αντί για το αίτημα-υπόσχεση.

Παραγωγή:

Ομορφη! Η σελίδα είναι γεμάτη με το σωστό περιεχόμενο!

Τώρα μπορούμε να χρησιμοποιήσουμε τα Chrome DevTools όπως κάναμε στο προηγούμενο παράδειγμα.

Φαίνεται ότι η Reddit βάζει τους τίτλους στις ετικέτες "h2". Ας χρησιμοποιήσουμε το Cheerio.js για να εξαγάγουμε τις ετικέτες h2 από τη σελίδα.

Παραγωγή:

Επιπρόσθετοι πόροι

Και υπάρχει η λίστα! Σε αυτό το σημείο θα πρέπει να αισθάνεστε άνετα να γράφετε την πρώτη σας ξύστρα για τη συλλογή δεδομένων από οποιονδήποτε ιστότοπο. Ακολουθούν μερικοί επιπλέον πόροι που μπορεί να σας φανούν χρήσιμοι κατά τη διάρκεια του ταξιδιού σας στο web scraping:

  • Κατάλογος υπηρεσιών μεσολάβησης απόξεσης ιστού
  • Λίστα εύχρηστων εργαλείων απόξεσης ιστού
  • Λίστα συμβουλών απόξεσης ιστού
  • Σύγκριση διακομιστών μεσολάβησης απόξεσης ιστού
  • Τεκμηρίωση Cheerio
  • Τεκμηρίωση Puppeteer