<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://chierchia.fr/wp-content/plugins/pretty-rss-feeds/xslt/pretty-feed.xsl" type="text/xsl" media="screen" ?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>python - Ange Chierchia</title>
	<atom:link href="https://chierchia.fr/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://chierchia.fr/tag/python/</link>
	<description>Développeur Web full-stack</description>
	<lastBuildDate>Sun, 13 Oct 2024 10:59:14 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://chierchia.fr/wp-content/uploads/cropped-16350293-SSDKVqo3-32x32.jpg</url>
	<title>python - Ange Chierchia</title>
	<link>https://chierchia.fr/tag/python/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
					<title>Scraper un site Web en Python</title>
					<link>https://chierchia.fr/2017/11/scraper-web-avec-python/</link>
					<comments>https://chierchia.fr/2017/11/scraper-web-avec-python/#respond</comments>
		
		<dc:creator><![CDATA[<span class='p-author h-card'>Ange Chierchia</span>]]></dc:creator>
		<pubDate>Fri, 17 Nov 2017 11:49:38 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[back-end]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scraper]]></category>
		<guid isPermaLink="false">https://nighcrawl.com/blog/2017/11/scraper-web-avec-python</guid>

					<description><![CDATA[Aujourd’hui on va voir comment utiliser Python afin de scraper une page ou un site Web afin de récupérer les informations qui nous intéressent et ainsi se constituer une base de données. Le scraping de sites Web fait partie de mon quotidien chez Ibakus Europe ces derniers mois, dans le cadre du développement d’une fonctionnalité [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class='e-content'>Aujourd’hui on va voir comment utiliser Python afin de scraper une page ou un site Web afin de récupérer les informations qui nous intéressent et ainsi se constituer une base de données.</p>
<p><span id="more-1333"></span></p>
<p>Le scraping de sites Web fait partie de mon quotidien chez Ibakus Europe ces derniers mois, dans le cadre du développement d’une fonctionnalité de notre application dédiée à la lutte contre le blanchiment d’argent et le financement du terrorisme.<br />
Le scraping de différentes sources nous a permit de constituer une base de données des sociétés européennes, permettant à nos utilisateurs de compléter leur fichier KYC avec les informations publiques dont on dispose sur leurs clients, en plus des informations qu’ils ont en leur possession.</p>
<p>Assez parlé d’Ibakus, passons au vif du sujet : la création d’un scraper web.</p>
<h2 id="création-du-scraper">Création du scraper</h2>
<p>Le but du scraper que l’on va écrire ici sera de récupérer les informations concernant les nouvelles sociétés luxembourgeoises créées. Nous allons donc faire un scraping du <a href="https://www.rcsl.lu/">site du RCSL</a>.</p>
<p>Pour cela nous allons utiliser la librairie Splinter, qui permettra à notre script de parcourir les pages comme si on le faisait nous même. Je vous invite à lire <a href="http://splinter.readthedocs.io/en/latest/">la documentation de la librairie</a> pour ce qui concerne son installation et les différentes fonctions disponibles.</p>
<p>Nous allons enregistrer le code source de notre scraper dans un fichier <code class="language-plaintext highlighter-rouge">scraper.py</code> en déclarant que nous voulons utiliser l’encodage <code class="language-plaintext highlighter-rouge">UTF-8</code> et utiliser la fonction <code class="language-plaintext highlighter-rouge">Browser()</code> de la librairie Splinter. Notre fichier débutera alors comme ça :</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code># coding: utf8
from splinter import browser
</code></pre>
</div>
</div>
<p>Tout ce qui va se passer ensuite sera executer comme si on naviguait vraiment depuis une fenêtre de navigateur Web. On appelle alors la fonction <code class="language-plaintext highlighter-rouge">Browser()</code> puis on se rend sur le site Web à scraper comme suit :</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>with Browser() as browser:
    url = "https://www.rcsl.lu"
    browser.visit(url)
</code></pre>
</div>
</div>
<p>Attention, il est important de bien faire attention à l’indentation du code. Ici, si on avait appellé la méthode <code class="language-plaintext highlighter-rouge">visit()</code> de l’objet <code class="language-plaintext highlighter-rouge">browser</code> sans l’indenter, ça n’aurait pas fonctionné car <code class="language-plaintext highlighter-rouge">browser</code> ne serait pas définit.<br />
On aurait par contre pu écrire ceci :</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>browser = Browser()
browser.visit(url)
</code></pre>
</div>
</div>
<p>Notre scraper se trouve maintenant sur la page d’accueil du site Web du RCSL. Pour récupérer la liste des sociétés consituées aujourd’hui, il faut que l’on clique sur le lien “Journal des publications” que l’on peut trouver au bas de la page. La librairie Splinter dispose de plusieurs fonctions permettant de <a href="http://splinter.readthedocs.io/en/latest/finding.html">retrouver un élément dans le DOM</a> et d’<a href="http://splinter.readthedocs.io/en/latest/elements-in-the-page.html">intéragir avec</a>. Dans notre cas nous aurons besoin des fonctions <code class="language-plaintext highlighter-rouge">is_element_present_by_css()</code>, <code class="language-plaintext highlighter-rouge">find_by_css()</code> et <code class="language-plaintext highlighter-rouge">click_link_by_partial_href()</code>.</p>
<p>Le lien que l’on cherche à cliquer contient la chaîne <code class="language-plaintext highlighter-rouge">DisplayOfficialJournalAction</code> dans son attribut <code class="language-plaintext highlighter-rouge">href</code>, nous allons donc cliquer dessus en faisant appelle à <code class="language-plaintext highlighter-rouge">click_link_by_partial_href()</code> ce qui nous amènera sur la page voulue :</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>browser.click_link_by_partial_href('mjrcs/jsp/DisplayOfficialJournalAction')
</code></pre>
</div>
</div>
<p>Dans cette nouvelle page on veut cliquer sur l’icône de téléchargement du fichier XML le plus récent (en haut de la liste).<br />
Pour être certain qu’il y a bien une liste de fichiers disponibles présente sur la page, on vérifie qu’un élément <code class="language-plaintext highlighter-rouge">table</code> ayant la classe <code class="language-plaintext highlighter-rouge">commonTable</code> existe dans le DOM. Si il existe, on récupère alors le quatrième élément <code class="language-plaintext highlighter-rouge">a</code> qu’il contient puis on visite l’URL contenue dans son attribut <code class="language-plaintext highlighter-rouge">href</code></p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>if browser.is_element_present_by_css('table.commonTable'):
    # Récupère l'URL vers le fichier XML des publications du jour
    xmlfile = browser.find_by_css('table.commonTable')
                    .find_by_css('tbody')
                    .find_by_css('a')[3]
    browser.visit(xmlfile['href'])
</code></pre>
</div>
</div>
<p>On enregistre ensuite le contenu du fichier en local.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>response = browser.html.encode('utf8', 'xmlcharrefreplace')
with open('notices.xml', 'w') as fh:
    fh.write(response)
</code></pre>
</div>
</div>
<p>Une fois le fichier récupéré en local, on peut imaginer un script Python ou PHP qui traiterai le contenu du fichier XML pour l’enregistrer dans une base de données.</p>
<p>Voilà le code source complet de notre scraper en Python :</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code># coding: utf8
from splinter import Browser # importe l'objet Browser de la librairie

with Browser() as browser:
    url = "https://www.rcsl.lu"
    browser.visit(url)
    # Effectue un clic sur le lien vers les publications du journal officiel
    browser.click_link_by_partial_href('mjrcs/jsp/DisplayOfficialJournalAction')
    # Vérifie que le tableau ayant la classe `commonTable` existe avant de passer à la suite
    if browser.is_element_present_by_css('table.commonTable'):
        # Récupère l'URL vers le fichier XML des publications du jour
        xmlfile = browser.find_by_css('table.commonTable')
                        .find_by_css('tbody')
                        .find_by_css('a')[3]
        browser.visit(xmlfile['href'])
        response = browser.html.encode('utf8', 'xmlcharrefreplace')
        # Enregistre le contenu du fichier XML dans un fichier en local
        with open('notices.xml', 'w') as fh:
            fh.write(response)
</code></pre>
</div>
</div>
<p>J’espère que cet article vous aura appris quelque chose et comme toujours, si vous avez des remarques ou des conseils pour l’améliorer, n’hésitez pas à m’en faire part sur Twitter ou dans les commentaires.</p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chierchia.fr/2017/11/scraper-web-avec-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
