{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 2A.eco - Web-Scraping\n", "\n", "Sous ce nom se cache une pratique tr\u00e8s utile pour toute personne souhaitant travailler sur des informations disponibles en ligne, mais n'existant pas forc\u00e9ment sous la forme d'un tableau *Excel*... Bref, il s'agit de r\u00e9cup\u00e9rer des informations depuis *Internet*."]}, {"cell_type": "markdown", "metadata": {}, "source": ["Le [webscraping](https://fr.wikipedia.org/wiki/Web_scraping) d\u00e9signe les techniques d'extraction du contenu des sites internet. Via un programme informatique : nous allons aujourd'hui vous pr\u00e9senter comme cr\u00e9er et ex\u00e9cuter ces robots afin de recup\u00e9rer rapidement des informations utiles \u00e0 vos projets actuels ou futurs."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Un d\u00e9tour par le Web : comment fonctionne un site ?\n", "\n", "M\u00eame si nous n'allons pas aujourd'hui faire un cours de web, il vous faut n\u00e9anmoins certaines bases pour comprendre comment un site internet fonctionne et comment sont structur\u00e9es les informations sur une page.\n", "\n", "\n"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Un site Web est un ensemble de pages cod\u00e9es en *HTML* qui permet de d\u00e9crire \u00e0 la fois le contenu et la forme d'une page *Web*.\n", "\n", "### HTML \n"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Les balises\n", "\n", "\n", "Sur une page web, vous trouverez toujours \u00e0 coup s\u00fbr des \u00e9l\u00e9ments comme ````, ````, etc. Il s'agit des codes qui vous permettent de structurer le contenu d'une page *HTML* et qui s'appellent des balises. \n", "Citons, par exemple, les balises ``<p>``, ``<h1>``, ``<h2>``, ``<h3>``, ``<strong>`` ou ``<em>``.\n", "Le symbole ``< >`` est une balise : il sert \u00e0 indiquer le d\u00e9but d'une partie. Le symbole ``</ >`` indique la fin de cette partie. La plupart des balises vont par paires, avec une *balise ouvrante* et une *balise fermante* (par exemple ``<p>`` et ``</p>``)."]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Exemple : les balise des tableaux\n", "\n", "$$\n", "\\begin{array}{rr} \\hline\n", "Balise & \\text{Description} \\\\ \\hline\n", "< table> & \\text{Tableau} \\\\\n", "< caption>& \\text{Titre du tableau} \\\\\n", "< tr> & \\text{Ligne de tableau} \\\\\n", "< th> & \\text{Cellule d'en-t\u00eate}\\\\\n", "< td> & \\text{Cellule} \\\\\n", "< thead> & \\text{Section de l'en-t\u00eate du tableau} \\\\\n", "< tbody> & \\text{Section du corps du tableau} \\\\\n", "< tfoot> & \\text{Section du pied du tableau} \\\\\n", "\\end{array}\n", "$$"]}, {"cell_type": "markdown", "metadata": {}, "source": ["##### Application : un tableau en HTML\n", "\n", "Le code *HTML* du tableau suivant"]}, {"cell_type": "raw", "metadata": {}, "source": ["<table>\n", " <tr>\n", " <th>Pr\u00e9nom</th>\n", " <th>Nom</th>\n", " <th>Profession</th>\n", " </tr>\n", " <tr>\n", " <td>Mike</td>\n", " <td>Stuntman</td>\n", " <td>Cascadeur</td>\n", " </tr>\n", " <tr>\n", " <td>Mister</td>\n", " <td>Pink</td>\n", " <td>Gangster</td>\n", " </tr>\n", "</table>"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Donnera dans le navigateur\n", "\n", "| Pr\u00e9nom | Mike | Mister |\n", "|------------|-----------|----------|\n", "| Nom | Stuntman | Pink |\n", "| Profession | Cascadeur | Gangster |\n"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Parent et enfant\n", "\n", "Dans le cadre du langage HTML, les termes de parents (parent) et enfants (child) servent \u00e0 d\u00e9signer des \u00e9lements embo\u00eet\u00e9s les uns dans les autres. Dans la construction suivante, par exemple :"]}, {"cell_type": "raw", "metadata": {}, "source": ["< div> \n", " < p>\n", " bla,bla\n", " < /p>\n", "< /div>"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On dira que l'\u00e9l\u00e9ment ``<div>`` est le parent de l'\u00e9l\u00e9ment ``<p>`` tandis que l'\u00e9l\u00e9ment ``<p>`` est l'enfant de l'\u00e9l\u00e9ment ``<div>``."]}, {"cell_type": "markdown", "metadata": {}, "source": ["----------\n", "\n", "Mais pourquoi apprendre \u00e7a pour scraper me direz-vous ?\n", "\n", "Pour bien r\u00e9cup\u00e9rer les informations d'un site internet, il faut pouvoir comprendre sa structure et donc son code HTML. Les fonctions python qui servent au scrapping sont principalement construites pour vous permettre de naviguer entre les balises."]}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": ["### Optionnel - CSS - le style de la page WEB\n", "\n", "Quand le bout de code html est \u00e9crit, il apaprait sous la forme d'un texte noir sur un fond blanc. Une mani\u00e8re simple de rendre la page plus belle, c'est d'y ajouter de la couleur. \n", "\n", "La feuille de style qui permet de rendre la page plus belle correspond au(x) fichier(s) [CSS](https://en.wikipedia.org/wiki/Cascading_Style_Sheets). Toutes les pages HTML qui font r\u00e9f\u00e9rence \u00e0 cette feuille de style externe h\u00e9riteront de toutes ses d\u00e9finitions. Nous y reviendrons plus en d\u00e9tail dans le TD sur [Flask](http://flask.pocoo.org/) (module Python de cr\u00e9ation de site internet)."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Scrapper avec python\n", "\n", "Nous allons essentiellement utiliser le package [BeautifulSoup4](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) pour ce cours, mais d'autres packages existent ([Selenium](https://selenium-python.readthedocs.io/), [Scrapy](https://scrapy.org/)...).\n", "\n", "[BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) sera suffisant quand vous voudrez travailler sur des pages HTML statiques, d\u00e8s que les informations que vous recherchez sont g\u00e9n\u00e9r\u00e9es via l'ex\u00e9cution de scripts [Javascript](https://fr.wikipedia.org/wiki/JavaScript), il vous faudra passer par des outils comme Selenium.\n", "\n", "De m\u00eame, si vous ne connaissez pas l'URL, il faudra passer par un framework comme [Scrapy](https://scrapy.org/), qui passe facilement d'une page \u00e0 une autre (\"crawl\"). Scrapy est plus complexe \u00e0 manipuler que [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) : si vous voulez plus de d\u00e9tails, rendez-vous sur la page du tutorial [Scrapy Tutorial](https://doc.scrapy.org/en/latest/intro/tutorial.html)."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Utiliser BeautifulSoup\n", "\n", "Les packages pour scrapper des pages HTML : \n", "- [BeautifulSoup4](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) (``pip install bs4``)\n", "- [urllib](https://docs.python.org/3/library/urllib.html#module-urllib)"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["import urllib\n", "import bs4\n", "#help(bs4)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### 1ere page HTML\n", "\n", "On va commencer facilement, prenons une page wikipedia, par exemple celle de la Ligue 1 de football : [Championnat de France de football 2016-2017](https://fr.wikipedia.org/wiki/Championnat_de_France_de_football_2016-2017). On va souhaiter r\u00e9cup\u00e9rer la liste des \u00e9quipes, ainsi que les url des pages Wikipedia de ces \u00e9quipes."]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["b'<!DOCTYPE html>\\n<html class=\"client-nojs\" lang=\"fr\" dir=\"ltr\">\\n<head>\\n<meta charset=\"UTF-8\"/>\\n<title>Championnat de France de football 2016-2017 \\xe2\\x80\\x94 Wikip\\xc3\\xa9dia\\n