Blog
Premiers pas avec Scrapy sous Mac OS X
- 5 mai 2014
- Publié par : Guillaume Peyronnet
- Catégorie : technique
Scrapy est un framework open source dédié au crawl et au scrap de sites web. On peut l’utiliser pour de nombreux usages : récupérer des contenus sur un site, auditer, récupérer de grandes portions du web, constituer des corpus, analyser des schémas de linking…
Se lancer dans de grandes manœuvres est tentant, mais c’est aussi le meilleur moyen de laisser penser que Scrapy est particulièrement complexe. Pour les tâches basiques, voire moyennement complexes, sachez-le, Scrapy est vraiment facile à mettre en oeuvre. La preuve par l’exemple.
D’ailleurs, dans les Masterclass, on l’utilise pour plusieurs usages 😉
Installer scrapy sous Mac Os X
(si vous êtes sous linux ou windows, Scrapy se configure de la même façon, mais s’installe différemment. Suivez la doc)
Vérifier votre version de Python
terminal$ /usr/bin/env python -V
Si le terminal affiche une version de Python en 2.7.x, c’est tout bon. Sinon, il faut installer Python 2.7.x en se rendant sur le site officiel de python : https://www.python.org/download/ et en choisissant un package 2.7.x pour Mac OS X.
Installer xcode
terminal$ xcode-select --install
Installer Scrapy
terminal$ sudo -E easy_install scrapy
Voilà, Scrapy est installé :
terminal$ scrapy
Cette ligne de commande devrait vous le confirmer 🙂
Pour se mettre en appétit et constater qu’utiliser scrapy n’est pas forcément complexe, lançons-nous dans une tâche de mini-audit : vérifier comment sont remplies les titres des pages d’un site web.
Utiliser Scrapy pour vérifier les balises d’un site</h2><br />
<p>On crée un nouveau projet (auquel on donne le nom “super”):</p><br />
<pre lang=”python” escaped=”true”>terminal$ scrapy startproject super</pre><br />
<h3>Puis on va éditer les fichiers de configuration :</h3><br />
<h4>dans super/super/setting.py</h4><br />
<pre lang=”python” escaped=”true”>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-</p>
<p>BOT_NAME = ‘super'<br />
SPIDER_MODULES = [‘super.spiders’]<br />
NEWSPIDER_MODULE = ‘super.spiders'</p>
<p>#on interroge doucement le site : on attend 5 secondes entre chaque requête<br />
DOWNLOAD_DELAY = 5</p>
<p>#On décide d’enregistrer les datas générées par le crawl dans liste.csv<br />
FEED_URI = ‘liste.csv'</p>
<p>#on retient le format csv comme format de fichier pour les datas récoltées<br />
FEED_FORMAT = ‘csv'<br />
FEED_EXPORTERS_BASE = {<br />
‘csv’: ‘scrapy.contrib.exporter.CsvItemExporter’,<br />
}</p>
<p>#on peut modifier le user agent à renvoyer au site crawlé ;)<br />
USER_AGENT = ‘super (+http://www.example.org)'</pre><br />
<h4>dans super/super/items.py</h4><br />
<pre lang=”python” escaped=”true”>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-</p>
<p>from scrapy.item import Item, Field</p>
<p>class SuperItem(Item):<br />
# on veut récupérer des datas : url / titre<br />
url = Field()<br />
titre = Field()<br />
pass</pre><br />
<h4>dans super/super/spiders/mySuper.py (oui, il faut créer le fichier !)</h4><br />
<pre lang=”python” escaped=”true”>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
from scrapy.contrib.spiders import CrawlSpider, Rule<br />
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor<br />
from super.items import SuperItem<br />
from scrapy.selector import Selector</p>
<p>class mySuper(CrawlSpider):<br />
name=”super”<br />
#on autorise seulement le crawl du site indiqué dans allowed_domains<br />
allowed_domains = [‘www.example.org’]</p>
<p>#démarrage sur la page d’accueil du site<br />
start_urls = [‘http://www.example.org’]</p>
<p>rules = (Rule (SgmlLinkExtractor(allow=(),deny=(),restrict_xpaths=()), callback=”parse_o”, follow= True),)</p>
<p>def parse_o(self,response):<br />
#récupération des datas récoltées (contenu de la page)<br />
sel = Selector(response)</p>
<p>#on prépare item, on va le remplir (souvenez-vous, dans items.py)<br />
item = SuperItem()</p>
<p>#on stocke l’url de la page dans le tableau item<br />
item[‘url’] = response.url</p>
<p>#on récupère le titre de la page ( titre ) grâce à un chemin xpath<br />
item[‘titre’] = sel.xpath(‘//title/text()’).extract()</p>
<p># on fait passer item à la suite du processus<br />
yield item</pre><br />
<p>Il suffit maintenant de lancer le spider et d’attendre que le fichier csv se remplisse tout seul.</p><br />
<pre lang=”python” escaped=”true”>terminal$ scrapy crawl super</pre><br />
<p>Voilà, on ouvre maintenant le fichier dans excel, openoffice, libreoffice, ou dans n’importe quel fichier capable de lire du csv (pourquoi pas un import dans une base de données pour faire des traitements annexes ?).</p><br />
<p>Scrapy est assez facilement adaptable à beaucoup de problématiques liées à l’exploration de pages web. Apprenez à l’utiliser et vous aurez un bel outil, plutôt polyvalent et performant, à ajouter à votre arsenal de référenceur.</p><br />
<hr /><br />
<p>N’hésitez pas à venir à l’une de nos Masterclass pour<a href=”https://freres.peyronnet.eu/produit/masterclass-moteurs-seo/” target=”_blank” rel=”noopener noreferrer”> découvrir d’autres usages de Scrapy</a>.</p><br />
<hr />
<p>On crée un nouveau projet (auquel on donne le nom “super”):</p><br />
<pre lang=”python” escaped=”true”>terminal$ scrapy startproject super</pre><br />
<h3>Puis on va éditer les fichiers de configuration :</h3><br />
<h4>dans super/super/setting.py</h4><br />
<pre lang=”python” escaped=”true”>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-</p>
<p>BOT_NAME = ‘super'<br />
SPIDER_MODULES = [‘super.spiders’]<br />
NEWSPIDER_MODULE = ‘super.spiders'</p>
<p>#on interroge doucement le site : on attend 5 secondes entre chaque requête<br />
DOWNLOAD_DELAY = 5</p>
<p>#On décide d’enregistrer les datas générées par le crawl dans liste.csv<br />
FEED_URI = ‘liste.csv'</p>
<p>#on retient le format csv comme format de fichier pour les datas récoltées<br />
FEED_FORMAT = ‘csv'<br />
FEED_EXPORTERS_BASE = {<br />
‘csv’: ‘scrapy.contrib.exporter.CsvItemExporter’,<br />
}</p>
<p>#on peut modifier le user agent à renvoyer au site crawlé ;)<br />
USER_AGENT = ‘super (+http://www.example.org)'</pre><br />
<h4>dans super/super/items.py</h4><br />
<pre lang=”python” escaped=”true”>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-</p>
<p>from scrapy.item import Item, Field</p>
<p>class SuperItem(Item):<br />
# on veut récupérer des datas : url / titre<br />
url = Field()<br />
titre = Field()<br />
pass</pre><br />
<h4>dans super/super/spiders/mySuper.py (oui, il faut créer le fichier !)</h4><br />
<pre lang=”python” escaped=”true”>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
from scrapy.contrib.spiders import CrawlSpider, Rule<br />
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor<br />
from super.items import SuperItem<br />
from scrapy.selector import Selector</p>
<p>class mySuper(CrawlSpider):<br />
name=”super”<br />
#on autorise seulement le crawl du site indiqué dans allowed_domains<br />
allowed_domains = [‘www.example.org’]</p>
<p>#démarrage sur la page d’accueil du site<br />
start_urls = [‘http://www.example.org’]</p>
<p>rules = (Rule (SgmlLinkExtractor(allow=(),deny=(),restrict_xpaths=()), callback=”parse_o”, follow= True),)</p>
<p>def parse_o(self,response):<br />
#récupération des datas récoltées (contenu de la page)<br />
sel = Selector(response)</p>
<p>#on prépare item, on va le remplir (souvenez-vous, dans items.py)<br />
item = SuperItem()</p>
<p>#on stocke l’url de la page dans le tableau item<br />
item[‘url’] = response.url</p>
<p>#on récupère le titre de la page ( titre ) grâce à un chemin xpath<br />
item[‘titre’] = sel.xpath(‘//title/text()’).extract()</p>
<p># on fait passer item à la suite du processus<br />
yield item</pre><br />
<p>Il suffit maintenant de lancer le spider et d’attendre que le fichier csv se remplisse tout seul.</p><br />
<pre lang=”python” escaped=”true”>terminal$ scrapy crawl super</pre><br />
<p>Voilà, on ouvre maintenant le fichier dans excel, openoffice, libreoffice, ou dans n’importe quel fichier capable de lire du csv (pourquoi pas un import dans une base de données pour faire des traitements annexes ?).</p><br />
<p>Scrapy est assez facilement adaptable à beaucoup de problématiques liées à l’exploration de pages web. Apprenez à l’utiliser et vous aurez un bel outil, plutôt polyvalent et performant, à ajouter à votre arsenal de référenceur.</p><br />
<hr /><br />
<p>N’hésitez pas à venir à l’une de nos Masterclass pour<a href=”https://freres.peyronnet.eu/produit/masterclass-moteurs-seo/” target=”_blank” rel=”noopener noreferrer”> découvrir d’autres usages de Scrapy</a>.</p><br />
<hr />