IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Crawling avec Scrapy


Sujet :

Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Un Passionné !!!
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Un Passionné !!!
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Par défaut Crawling avec Scrapy
    Bonjour,
    Je sollicite l'aide des développeurs Python et qui connaisse le Framework "Scrapy" et aussi les autres.
    Je suis nouveau dans le monde python et encore plus avec Scrapy.

    Mon projet :
    Récupérer tous les produits qui m'intéresse sur Cdiscount.

    Ex:
    Je voudrais récupérer tous les ordinateurs portables qui se trouve à cette URL.

    http://www.cdiscount.com/informatiqu...l-1070922.html



    j'ai analysé la structure HTML de la page, ce qui m'intéresse se trouve dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <div class="mainColumn Pl">
    	<div class="boxSimple pad05em list" id="productList">
    		<div class="plProductView" data-sku="F552CLSX236H">
    			<div class="plViewZone_1">
    				RAPATRIER Tous ce qui se trouve ici
    			</div>
    			<div class="plViewZone_2">
    				RAPATRIER Tous ce qui se trouve ici
    			</div>
    		</div>
    	</div>
    </div>
    Comme dit dans mon code j'aimerais rapatrier ce qui se trouve dans la "class = plViewZone_1" et "class = plViewZone_2"
    Donc la marque du PC, l'image, la description, le nom ainsi que le lien vers la page qui se trouve dans un HREF avec le nom du PC et la balise "data-sku" qui se trouve dans la "class = plProductView".

    Voici mon Crawler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    	from scrapy.contrib.spiders import CrawlSpider, Rule
    	from scrapy.selector import Selector
    	from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    	from enPromos.items import EnpromosItem
     
    	class CDiscount(CrawlSpider):
    		name = 'cdiscount'
    		allowed_domains = ['cdiscount.com']
    		start_urls = ['http://www.cdiscount.com']
     
    		rules = (
    			Rule (SgmlLinkExtractor(
    				deny = (
    					'\/about','\/maison\/','\/chaussures\/',
    					'\/pret-a-porter\/','\/bijouterie\/',
    					'\/bagages\/','\/le-sport\/','\/vin-champagne\/',
    					'\/au-quotidien\/','\/juniors\/','\/dvd\/','\/livres-bd\/',
    					'\/tout\/','\/carte-cdiscount\/','/mentions-legales.html',
    					'\/culture-multimedia\/','/plan-du-site.asp')
    					), callback='parse_item'),
    		)
     
    		def parse_item(self, response):
    			self.log('la page est %s' % response.url)
    			url_crawl = open('url.txt', 'a')
    			url_crawl.write(str(response.url) + '\n')
    			url_crawl.close()
    			# my item
    			my_item = EnpromosItem()
    			# selector methode call
    			sel = Selector(response)
     
    			my_item['id'] = sel.xpath('//div[@class="plProductView"]/@data-sku').extract()
    			my_item['name'] = sel.xpath('//a[@class="plPrName"]/@title').extract()
    			my_item['descrip'] = sel.xpath('//span[@class="plPrDesc"]/@data-longdesc').extract()
    			my_item['img'] = sel.xpath('//div[@class="plProductImg"]/img/@src').extract()
    			my_item['brand'] = sel.xpath('//img[@class="plLogo"]/@src').extract()
     
    			return my_item
    Mon Item:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    # Define here the models for your scraped items
    #
    # See documentation in:
    # http://doc.scrapy.org/en/latest/topics/items.html
     
    from scrapy.item import Item, Field
     
    class EnpromosItem(Item):
        # define the fields for your item here like:
    	id = Field()
    	name = Field()
    	descrip = Field()
    	img = Field()
    	brand = Field()
    Mon code actuel fonctionne pour le "data-sku" mais pour le reste cela ne fonctionne pas. N'étant pas très à l'aise avec le XPATH je sollicite votre aide et vos lumières.

    Cordialement,

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 591
    Par défaut
    Salut,

    scrapy est un "crawler".
    Autrement dit, un engin qui permet de parcourir une arborescence d'URL pour y récupérer liens et contenus, les stocker en base et effectuer des mises a jours incrémentales - ce qui a change depuis le dernier crawl.

    Récupérer des informations basées sur la structure de la page se fait dans un deuxième temps - après avoir récupéré la nouvelle page -.
    note: cela permet de tester l'extraction hors "crawler" en travaillant sur la page Web "fichier".

    => Pour mettre au point votre extraction, scrapy suggère de le lancer via la commande: scrapy shell [url|file]. Ca charge la page et vous avez une variable globale "sel" pour jouer avec le selector.

    Pour faire ce boulot, vous pouvez aussi utiliser BeautifullSoup ou lxml. Pas la peine d'apprendre a travailler avec le selector builtin dans scrapy si on en connaît déjà d'autres.
    note: et si vous n'en connaissez aucun, choisissez plutôt un couteau suisse tel que BeautifullSoup.

    Pour visualiser la "structure" de la page, on peut (par exemple) utiliser l'inspector de firefox (ou de webkit): on clicke sur le "block" intéressant pour récupérer son "adresse" dans le document qu'on utilise pour "viser" le "block" de façon programmatique.

    A priori, dans votre cas, vous itérez sur les <div class="plProductView"...> * inner html * </div>.
    Le sku est un attribut du div et les autres informations sont dans "* inner html *" qu'il faudra traiter séparément.

    Vous pouvez commencez a jouer avec scrapy shell (on se retourve avec une console iPython):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In [2]: for e in sel.xpath('//div[@class="plProductView"]'):
    ...    print (e.extract()) # inner HTML
    ...    q = raw_input('*next*?')
    ...    if q: break
    Rien de bien complique avec Python, mais il faut connaître un peu les technos. sous-jacentes, savoir programmer et coder en Python.
    Ce qui fait pas mal de pré-requis avant de pouvoir envisager d'utiliser un framework comme Scrapy.

    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Un Passionné !!!
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Un Passionné !!!
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Par défaut
    Tout d'abord merci à vous @wiztricks!

    Je vais regarder du coté de "BeautifulSoup",
    en ce qui concerne mon programme donc je doit séquencer les étapes:

    1) crawler
    2) parser les liens avec scrapy shell || BeautifulSoup.

    Je vais regarder cela et je ferais un retour sous dizaine,

    encore merci.

Discussions similaires

  1. probleme avec SCrapy
    Par fezzani dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 01/09/2014, 14h55
  2. Lancer un crawl avec heritrix
    Par GoldenEyes dans le forum Débuter
    Réponses: 0
    Dernier message: 09/09/2010, 15h08
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 12h51
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo