Πώς να αποκόψετε ιστοσελίδες με το Python και το BeautifulSoup

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

Χρειάζεστε ξύσιμο ιστού.

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

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

Ξεκινώντας

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

  • Για χρήστες Mac, το Python είναι προεγκατεστημένο στο OS X. Ανοίξτε το Terminal και πληκτρολογήστε python --version. Θα πρέπει να δείτε ότι η έκδοση python είναι 2.7.x.
  • Για χρήστες Windows, εγκαταστήστε το Python μέσω του επίσημου ιστότοπου.

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

Στο τερματικό, πληκτρολογήστε:

easy_install pip pip install BeautifulSoup4

Σημείωση : Εάν δεν εκτελέσετε την παραπάνω γραμμή εντολών, δοκιμάστε να προσθέσετε sudoμπροστά από κάθε γραμμή.

Τα βασικά

Πριν αρχίσουμε να μπαίνουμε στον κώδικα, ας κατανοήσουμε τα βασικά του HTML και ορισμένους κανόνες απόξεσης.

Ετικέτες HTML

Εάν έχετε ήδη καταλάβει ετικέτες HTML, μη διστάσετε να παραλείψετε αυτό το μέρος.

First Scraping

Hello World

Αυτή είναι η βασική σύνταξη μιας ιστοσελίδας HTML. Κάθε εξυπηρετεί ένα μπλοκ μέσα στην ιστοσελίδα:

1 .: Τα έγγραφα HTML πρέπει να ξεκινούν με μια δήλωση τύπου.

2. Το έγγραφο HTML περιλαμβάνεται μεταξύ και .

3. Η δήλωση μετα και σεναρίου του εγγράφου HTML βρίσκεται μεταξύ και .

4. Το ορατό μέρος του εγγράφου HTML βρίσκεται μεταξύ και ετικετών.

5. Οι τίτλοι τίτλων ορίζονται με το

διά μέσου

ετικέτες.

6. Οι παράγραφοι ορίζονται με το

Other useful tags include for hyperlinks,

for tables, for table rows, and
για στήλες πίνακα.

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

Για περισσότερες πληροφορίες σχετικά με ετικέτες HTML, αναγνωριστικό και τάξη, ανατρέξτε στο W3Schools Tutorials.

Κανόνες απόξεσης

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

Επιθεώρηση της σελίδας

Ας πάρουμε μια σελίδα από τον ιστότοπο του Bloomberg Quote ως παράδειγμα.

Ως κάποιος που ακολουθεί το χρηματιστήριο, θα θέλαμε να λάβουμε το όνομα ευρετηρίου (S&P 500) και την τιμή του από αυτήν τη σελίδα. Πρώτα, κάντε δεξί κλικ και ανοίξτε το πρόγραμμα επιθεώρησης του προγράμματος περιήγησής σας για να ελέγξετε την ιστοσελίδα.

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

Από το αποτέλεσμα, μπορούμε να δούμε ότι η τιμή βρίσκεται μέσα σε μερικά επίπεδα ετικετών HTML, που είναι .

Ομοίως, εάν τοποθετήσετε το δείκτη του ποντικιού και κάνετε κλικ στο όνομα "S&P 500 Index", βρίσκεται μέσα και

.

Τώρα γνωρίζουμε τη μοναδική τοποθεσία των δεδομένων μας με τη βοήθεια classετικετών.

Μεταβείτε στον Κώδικα

Τώρα που ξέρουμε πού βρίσκονται τα δεδομένα μας, μπορούμε να αρχίσουμε να κωδικοποιούμε το web scraper. Ανοίξτε το πρόγραμμα επεξεργασίας κειμένου τώρα!

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

# import libraries import urllib2 from bs4 import BeautifulSoup

Στη συνέχεια, δηλώστε μια μεταβλητή για το url της σελίδας.

# specify the url quote_page = ‘//www.bloomberg.com/quote/SPX:IND'

Στη συνέχεια, χρησιμοποιήστε το Python urllib2 για να δηλώσετε τη σελίδα HTML του url.

# query the website and return the html to the variable ‘page’ page = urllib2.urlopen(quote_page)

Τέλος, αναλύστε τη σελίδα σε μορφή BeautifulSoup για να μπορέσουμε να χρησιμοποιήσουμε το BeautifulSoup για να το επεξεργαστούμε.

# parse the html using beautiful soup and store in variable `soup` soup = BeautifulSoup(page, ‘html.parser’)

Now we have a variable, soup, containing the HTML of the page. Here’s where we can start coding the part that extracts the data.

Remember the unique layers of our data? BeautifulSoup can help us get into these layers and extract the content with find(). In this case, since the HTML class name is unique on this page, we can simply query .

# Take out the of name and get its value name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

After we have the tag, we can get the data by getting its text.

name = name_box.text.strip() # strip() is used to remove starting and trailing print name

Similarly, we can get the price too.

# get the index price price_box = soup.find(‘div’, attrs={‘class’:’price’}) price = price_box.text print price

When you run the program, you should be able to see that it prints out the current price of the S&P 500 Index.

Export to Excel CSV

Now that we have the data, it is time to save it. The Excel Comma Separated Format is a nice choice. It can be opened in Excel so you can see the data and process it easily.

But first, we have to import the Python csv module and the datetime module to get the record date. Insert these lines to your code in the import section.

import csv from datetime import datetime

At the bottom of your code, add the code for writing data to a csv file.

# open a csv file with append, so old data will not be erased with open(‘index.csv’, ‘a’) as csv_file: writer = csv.writer(csv_file) writer.writerow([name, price, datetime.now()])

Now if you run your program, you should able to export an index.csv file, which you can then open with Excel, where you should see a line of data.

So if you run this program everyday, you will be able to easily get the S&P 500 Index price without rummaging through the website!

Going Further (Advanced uses)

Multiple Indices

So scraping one index is not enough for you, right? We can try to extract multiple indices at the same time.

First, modify the quote_page into an array of URLs.

quote_page = [‘//www.bloomberg.com/quote/SPX:IND', ‘//www.bloomberg.com/quote/CCMP:IND']

Then we change the data extraction code into a for loop, which will process the URLs one by one and store all the data into a variable data in tuples.

# for loop data = [] for pg in quote_page: # query the website and return the html to the variable ‘page’ page = urllib2.urlopen(pg) # parse the html using beautiful soap and store in variable `soup` soup = BeautifulSoup(page, ‘html.parser’) # Take out the of name and get its value name_box = soup.find(‘h1’, attrs={‘class’: ‘name’}) name = name_box.text.strip() # strip() is used to remove starting and trailing # get the index price price_box = soup.find(‘div’, attrs={‘class’:’price’}) price = price_box.text # save the data in tuple data.append((name, price))

Also, modify the saving section to save data row by row.

# open a csv file with append, so old data will not be erased with open(‘index.csv’, ‘a’) as csv_file: writer = csv.writer(csv_file) # The for loop for name, price in data: writer.writerow([name, price, datetime.now()])

Rerun the program and you should be able to extract two indices at the same time!

Advanced Scraping Techniques

BeautifulSoup is simple and great for small-scale web scraping. But if you are interested in scraping data at a larger scale, you should consider using these other alternatives:

  1. Scrapy, a powerful python scraping framework
  2. Try to integrate your code with some public APIs. The efficiency of data retrieval is much higher than scraping webpages. For example, take a look at Facebook Graph API, which can help you get hidden data which is not shown on Facebook webpages.
  3. Consider using a database backend like MySQL to store your data when it gets too large.

Adopt the DRY Method

DRY stands for “Don’t Repeat Yourself”, try to automate your everyday tasks like this person. Some other fun projects to consider might be keeping track of your Facebook friends’ active time (with their consent of course), or grabbing a list of topics in a forum and trying out natural language processing (which is a hot topic for Artificial Intelligence right now)!

If you have any questions, please feel free to leave a comment below.

References

//www.gregreda.com/2013/03/03/web-scraping-101-with-python/

//www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/

Αυτό το άρθρο δημοσιεύθηκε αρχικά στο blog του Altitude Labs και γράφτηκε από τον μηχανικό λογισμικού μας, Leonard Mok. Το Altitude Labs είναι μια εταιρεία λογισμικού που ειδικεύεται σε εξατομικευμένες εφαρμογές React για κινητά.