Comment gratter des sites Web avec Python et BeautifulSoup

Il y a plus d'informations sur Internet que n'importe quel humain ne peut en absorber dans sa vie. Ce dont vous avez besoin, ce n’est pas l’accès à ces informations, mais un moyen évolutif pour les collecter, les organiser et les analyser.

Vous avez besoin de web scraping.

Le scraping Web extrait automatiquement les données et les présente dans un format que vous pouvez facilement comprendre. Dans ce tutoriel, nous nous concentrerons sur ses applications sur le marché financier, mais le web scraping peut être utilisé dans une grande variété de situations.

Si vous êtes un investisseur passionné, obtenir des cours de clôture tous les jours peut être pénible, en particulier lorsque les informations dont vous avez besoin se trouvent sur plusieurs pages Web. Nous faciliterons l'extraction des données en créant un grattoir Web pour récupérer automatiquement les indices boursiers sur Internet.

Commencer

Nous allons utiliser Python comme langage de scraping, avec une bibliothèque simple et puissante, BeautifulSoup.

  • Pour les utilisateurs de Mac, Python est préinstallé dans OS X. Ouvrez Terminal et tapez python --version. Vous devriez voir que votre version de python est 2.7.x.
  • Pour les utilisateurs de Windows, veuillez installer Python via le site officiel.

Ensuite, nous devons obtenir la bibliothèque BeautifulSoup à l'aide d' pipun outil de gestion de paquets pour Python.

Dans le terminal, saisissez:

easy_install pip pip install BeautifulSoup4

Remarque : Si vous ne parvenez pas à exécuter la ligne de commande ci-dessus, essayez d'ajouter sudodevant chaque ligne.

Les bases

Avant de commencer à entrer dans le code, comprenons les bases du HTML et quelques règles de scraping.

Balises HTML

Si vous comprenez déjà les balises HTML, n'hésitez pas à ignorer cette partie.

First Scraping

Hello World

Il s'agit de la syntaxe de base d'une page Web HTML. Chacun sert un bloc à l'intérieur de la page Web:

1 .: Les documents HTML doivent commencer par une déclaration de type.

2. Le document HTML est compris entre et .

3. La déclaration de méta et de script du document HTML est comprise entre et .

4. La partie visible du document HTML se trouve entre les balises et .

5. Les en-têtes de titre sont définis avec le

Original text


par

Mots clés.

6. Les paragraphes sont définis avec le

Other useful tags include for hyperlinks,

for tables, for table rows, and
pour les colonnes de table.

De plus, les balises HTML sont parfois accompagnées d' attributs idou class. L' idattribut spécifie un identifiant unique pour une balise HTML et la valeur doit être unique dans le document HTML. L' classattribut est utilisé pour définir des styles égaux pour les balises HTML de la même classe. Nous pouvons utiliser ces identifiants et classes pour nous aider à localiser les données souhaitées.

Pour plus d'informations sur les balises HTML, les identifiants et les classes, veuillez consulter les didacticiels W3Schools.

Règles de raclage

  1. Vous devriez vérifier les conditions générales d'un site Web avant de le gratter. Veillez à lire les déclarations sur l'utilisation légale des données. En règle générale, les données que vous récupérez ne doivent pas être utilisées à des fins commerciales.
  2. Ne demandez pas de données au site Web de manière trop agressive avec votre programme (également connu sous le nom de spam), car cela pourrait endommager le site Web. Assurez-vous que votre programme se comporte de manière raisonnable (c.-à-d. Agit comme un humain). Une demande d'une page Web par seconde est une bonne pratique.
  3. La mise en page d'un site Web peut changer de temps en temps, alors assurez-vous de revoir le site et de réécrire votre code si nécessaire

Inspection de la page

Prenons une page du site Web Bloomberg Quote comme exemple.

En tant que suivi du marché boursier, nous aimerions obtenir le nom de l'indice (S&P 500) et son prix sur cette page. Tout d'abord, faites un clic droit et ouvrez l'inspecteur de votre navigateur pour inspecter la page Web.

Essayez de faire passer votre curseur sur le prix et vous devriez pouvoir voir une boîte bleue l'entourant. Si vous cliquez dessus, le code HTML associé sera sélectionné dans la console du navigateur.

À partir du résultat, nous pouvons voir que le prix est à l'intérieur de quelques niveaux de balises HTML, ce qui est .

De même, si vous survolez et cliquez sur le nom «Index S&P 500», il se trouve à l'intérieur et

.

Nous connaissons maintenant l'emplacement unique de nos données à l'aide de classbalises.

Entrez dans le code

Maintenant que nous savons où se trouvent nos données, nous pouvons commencer à coder notre grattoir Web. Ouvrez votre éditeur de texte maintenant!

Tout d'abord, nous devons importer toutes les bibliothèques que nous allons utiliser.

# import libraries import urllib2 from bs4 import BeautifulSoup

Ensuite, déclarez une variable pour l'url de la page.

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

Ensuite, utilisez Python urllib2 pour obtenir la page HTML de l'url déclarée.

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

Enfin, analysez la page au format BeautifulSoup afin que nous puissions utiliser BeautifulSoup pour travailler dessus.

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