So kratzen Sie Websites mit Python und BeautifulSoup

Im Internet gibt es mehr Informationen, als jeder Mensch in seinem Leben aufnehmen kann. Sie benötigen keinen Zugriff auf diese Informationen, sondern eine skalierbare Methode zum Sammeln, Organisieren und Analysieren.

Sie benötigen Web Scraping.

Web Scraping extrahiert Daten automatisch und präsentiert sie in einem Format, das Sie leicht verstehen können. In diesem Tutorial konzentrieren wir uns auf seine Anwendungen auf dem Finanzmarkt, aber Web Scraping kann in einer Vielzahl von Situationen eingesetzt werden.

Wenn Sie ein begeisterter Investor sind, kann es schwierig sein, jeden Tag Schlusskurse zu erhalten, insbesondere wenn die benötigten Informationen auf mehreren Webseiten zu finden sind. Wir vereinfachen die Datenextraktion, indem wir einen Web-Scraper erstellen, mit dem Aktienindizes automatisch aus dem Internet abgerufen werden können.

Loslegen

Wir werden Python als Scraping-Sprache zusammen mit einer einfachen und leistungsstarken Bibliothek, BeautifulSoup, verwenden.

  • Für Mac-Benutzer ist Python in OS X vorinstalliert. Öffnen Sie Terminal und geben Sie ein python --version. Sie sollten sehen, dass Ihre Python-Version 2.7.x ist.
  • Für Windows-Benutzer installieren Sie Python bitte über die offizielle Website.

Als nächstes müssen wir die BeautifulSoup-Bibliothek mit pipeinem Paketverwaltungstool für Python herunterladen.

Geben Sie im Terminal Folgendes ein:

easy_install pip pip install BeautifulSoup4

Hinweis : Wenn Sie die obige Befehlszeile nicht ausführen können, versuchen Sie, sie sudovor jeder Zeile hinzuzufügen .

Die Grundlagen

Bevor wir mit dem Code beginnen, sollten wir uns mit den Grundlagen von HTML und einigen Regeln für das Scraping vertraut machen.

HTML-Tags

Wenn Sie HTML-Tags bereits verstehen, können Sie diesen Teil überspringen.

First Scraping

Hello World

Dies ist die grundlegende Syntax einer HTML-Webseite. Jeder dient einen Block innerhalb der Webseite:

1 . : HTML-Dokumente müssen mit einer Typdeklaration beginnen.

2. Das HTML-Dokument befindet sich zwischen und .

3. Die Meta- und Skriptdeklaration des HTML-Dokuments befindet sich zwischen und .

4. Der sichtbare Teil des HTML-Dokuments befindet sich zwischen und Tags.

5. Titelüberschriften werden mit dem definiert

Original text


durch

Stichworte.

6. Absätze werden mit dem definiert

Other useful tags include for hyperlinks,

for tables, for table rows, and
für Tabellenspalten.

Außerdem werden HTML-Tags manchmal mit idoder classAttributen geliefert. Das idAttribut gibt eine eindeutige ID für ein HTML-Tag an und der Wert muss innerhalb des HTML-Dokuments eindeutig sein. Das classAttribut wird verwendet, um gleiche Stile für HTML-Tags mit derselben Klasse zu definieren. Wir können diese IDs und Klassen verwenden, um die gewünschten Daten zu finden.

Weitere Informationen zu HTML-Tags, ID und Klasse finden Sie in den W3Schools-Tutorials.

Kratzregeln

  1. Sie sollten die Allgemeinen Geschäftsbedingungen einer Website überprüfen, bevor Sie sie kratzen. Lesen Sie die Aussagen zur legalen Verwendung von Daten sorgfältig durch. Normalerweise sollten die Daten, die Sie kratzen, nicht für kommerzielle Zwecke verwendet werden.
  2. Fordern Sie mit Ihrem Programm keine zu aggressiven Daten von der Website an (auch als Spam bezeichnet), da dies die Website beschädigen kann. Stellen Sie sicher, dass sich Ihr Programm angemessen verhält (dh sich wie ein Mensch verhält). Eine Anfrage für eine Webseite pro Sekunde ist eine gute Praxis.
  3. Das Layout einer Website kann sich von Zeit zu Zeit ändern. Besuchen Sie die Website daher erneut und schreiben Sie Ihren Code nach Bedarf neu

Überprüfen der Seite

Nehmen wir als Beispiel eine Seite von der Bloomberg Quote-Website.

Als jemand, der der Börse folgt, möchten wir den Indexnamen (S & P 500) und seinen Preis von dieser Seite erhalten. Klicken Sie zunächst mit der rechten Maustaste und öffnen Sie den Inspektor Ihres Browsers, um die Webseite zu überprüfen.

Bewegen Sie den Mauszeiger über den Preis und Sie sollten in der Lage sein, ein blaues Kästchen um ihn herum zu sehen. Wenn Sie darauf klicken, wird der zugehörige HTML-Code in der Browserkonsole ausgewählt.

Aus dem Ergebnis können wir ersehen, dass der Preis innerhalb einiger Ebenen von HTML-Tags liegt, nämlich .

Wenn Sie den Mauszeiger bewegen und auf den Namen „S & P 500 Index“ klicken, befindet er sich ebenfalls in und

.

Jetzt kennen wir den eindeutigen Speicherort unserer Daten mithilfe von classTags.

Springe in den Code

Jetzt, da wir wissen, wo sich unsere Daten befinden, können wir mit der Codierung unseres Web Scraper beginnen. Öffnen Sie jetzt Ihren Texteditor!

Zuerst müssen wir alle Bibliotheken importieren, die wir verwenden werden.

# import libraries import urllib2 from bs4 import BeautifulSoup

Als nächstes deklarieren Sie eine Variable für die URL der Seite.

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

Verwenden Sie dann Python urllib2, um die HTML-Seite der deklarierten URL abzurufen.

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

Analysieren Sie die Seite abschließend im BeautifulSoup-Format, damit wir mit BeautifulSoup daran arbeiten können.

# 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/

This article was originally published on Altitude Labs’ blog and was written by our software engineer, Leonard Mok. Altitude Labs is a software agency that specializes in personalized, mobile-first React apps.