Πώς να ξύσετε άρθρα Wikipedia με Python

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

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

Νομίζω ότι θα είναι διασκεδαστικό να δούμε ποιες τυχαίες σελίδες Wikipedia θα επισκεφτεί αυτή η ξύστρα!

Εγκατάσταση της ξύστρας

Για να ξεκινήσω, θα δημιουργήσω ένα νέο αρχείο python που ονομάζεται scraper.py:

touch scraper.py

Για να κάνω το αίτημα HTTP, θα χρησιμοποιήσω τη requestsβιβλιοθήκη. Μπορείτε να το εγκαταστήσετε με την ακόλουθη εντολή:

pip install requests

Ας χρησιμοποιήσουμε τη σελίδα wiki απόξεσης ιστού ως αφετηρία μας:

import requests response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) print(response.status_code) 

Κατά την εκτέλεση της ξύστρας, θα πρέπει να εμφανίζει έναν κωδικό κατάστασης 200:

python3 scraper.py 200

Εντάξει, τόσο καλά! ;

Εξαγωγή δεδομένων από τη σελίδα

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

pip install beautifulsoup4

Κατά την επιθεώρηση της σελίδας της Βικιπαίδειας βλέπω ότι η ετικέτα τίτλου έχει το #firstHeadingαναγνωριστικό.

Η όμορφη σούπα σας επιτρέπει να βρείτε ένα στοιχείο από την ετικέτα ταυτότητας.

title = soup.find(id="firstHeading")

Συνδυάζοντας τα όλα το πρόγραμμα μοιάζει τώρα με αυτό:

import requests from bs4 import BeautifulSoup response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.string) 

Και όταν το εκτελείτε, δείχνει τον τίτλο του άρθρου Wiki:?

python3 scraper.py Web scraping

Ξύσιμο άλλων συνδέσμων

Τώρα θα βουτήξω βαθιά στη Wikipedia. Θα τραβήξω μια τυχαία ετικέτα σε ένα άλλο άρθρο της Wikipedia και θα ξύσω αυτήν τη σελίδα.

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

import requests from bs4 import BeautifulSoup import random response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.content) # Get all the links allLinks = soup.find(id="bodyContent").find_all("a") random.shuffle(allLinks) linkToScrape = 0 for link in allLinks: # We are only interested in other wiki articles if link['href'].find("/wiki/") == -1: continue # Use this link to scrape linkToScrape = link break print(linkToScrape)

Όπως μπορείτε να δείτε, χρησιμοποιώ το soup.find(id="bodyContent").find_all("a")για να βρω όλες τις ετικέτες στο κύριο άρθρο.

Επειδή ενδιαφέρομαι μόνο για συνδέσμους προς άλλα άρθρα της wikipedia, βεβαιωθώ ότι ο σύνδεσμος περιέχει το /wikiπρόθεμα.

Όταν εκτελείτε το πρόγραμμα, εμφανίζει έναν σύνδεσμο προς ένα άλλο άρθρο της wikipedia, ωραία!

python3 scraper.py Link farm

Δημιουργία ατελείωτης ξύστρας

Εντάξει, ας κάνουμε την ξύστρα να ξύσει τον νέο σύνδεσμο.

Για να το κάνω αυτό, θα μεταφέρω τα πάντα σε μια scrapeWikiArticleσυνάρτηση.

import requests from bs4 import BeautifulSoup import random def scrapeWikiArticle(url): response = requests.get( url=url, ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.text) allLinks = soup.find(id="bodyContent").find_all("a") random.shuffle(allLinks) linkToScrape = 0 for link in allLinks: # We are only interested in other wiki articles if link['href'].find("/wiki/") == -1: continue # Use this link to scrape linkToScrape = link break scrapeWikiArticle("//en.wikipedia.org" + linkToScrape['href']) scrapeWikiArticle("//en.wikipedia.org/wiki/Web_scraping")

Η scrapeWikiArticleσυνάρτηση θα πάρει το άρθρο wiki, θα εξαγάγει τον τίτλο και θα βρει έναν τυχαίο σύνδεσμο.

Στη συνέχεια, θα καλέσει scrapeWikiArticleξανά με αυτόν τον νέο σύνδεσμο. Έτσι, δημιουργεί έναν ατελείωτο κύκλο Scraper που αναπηδά στην wikipedia.

Ας εκτελέσουμε το πρόγραμμα και να δούμε τι παίρνουμε:

pythron3 scraper.py Web scraping Digital object identifier ISO 8178 STEP-NC ISO/IEC 2022 EBCDIC 277 Code page 867 Code page 1021 EBCDIC 423 Code page 950 G R Mole (unit) Gram Remmius Palaemon  Eleventh Edition Geography Gender studies Feminism in Brazil

Φοβερό, σε περίπου 10 βήματα πήγαμε από το "Web Scraping" στο "Φεμινισμός στη Βραζιλία". Φοβερο!

συμπέρασμα

Έχουμε δημιουργήσει μια ξύστρα ιστού στην Python που απομακρύνει τυχαίες σελίδες Wikipedia. Αναπηδά ασταμάτητα στη Wikipedia ακολουθώντας τυχαίους συνδέσμους.

Αυτό είναι ένα διασκεδαστικό τέχνασμα και η Wikipedia είναι αρκετά επιεική όταν πρόκειται για το web scraping.

Υπάρχουν επίσης πιο δύσκολο να αφαιρεθούν ιστότοποι όπως το Amazon ή το Google. Εάν θέλετε να διαγράψετε έναν τέτοιο ιστότοπο, θα πρέπει να δημιουργήσετε ένα σύστημα με προγράμματα περιήγησης Chrome χωρίς διακομιστές και διακομιστές μεσολάβησης. Ή μπορείτε να χρησιμοποιήσετε μια υπηρεσία που χειρίζεται όλα αυτά για εσάς που σας αρέσει αυτή.

Αλλά προσέξτε να μην κάνετε κατάχρηση ιστότοπων και να αποκόψετε μόνο δεδομένα που επιτρέπεται να κάνετε κατάργηση.

Καλή κωδικοποίηση!