Vous n'êtes pas identifié(e).

  • Contributions :
  • Vos boîtes de messages privés sont vides.

#1 2014-05-11 13:47:53

Mention em1xam
Recruit
Inscription : 2014-03-17
Messages : 11

Petit crawler scrapy

Salut !

Je vous propose un petit robot python réalisé avec scrapy qui permet de crawler un site marchand et de recuperer des infos sur les produits (nom, prix, image et url).

J'ai suivi la doc ici : http://doc.scrapy.org/en/latest/intro/tutorial.html et j'ai fait quelques recherches pour parfaire le script (notamment sur  stackoverflow.com)

Prérequis :
                    - installer scrapy
                    - créer un nouveau projet ( scrapy startproject mon_projet )
                    - renseigner le fichier items.py comme suit :


from scrapy.item import Item, Field

class MyItems(Item):
    FULL_NAME = Field()
    PRICE = Field()
    IMAGE = Field()
    DEEPLINK = Field()
    pass

Voici le code :


from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

# On importe les "items" du fichier items.py
from scrapcigaprix.items import MyItems

# On créer le robot en spécifiant son nom et le site à crawler
class MySpider(CrawlSpider):
    name = "mon-robot"
    allowed_domains = ["site-exemple.fr"]
    start_urls = [
                   "http://url-exemple.fr",      
          ]

# On utilise SgmlLinkExtractor avec follow=true pour recuperer toutes les url, en excluant celle qu'on ne veut pas (ici toutes les url contenant 'panier' ou 'html#')
   rules = (  
               Rule(SgmlLinkExtractor(allow=(), deny=('panier', 'html#')), callback="parse_em1xam", follow="True"),
             )


    def parse_em1xam(self, response):

# grâce au selecteur et xpath, on selectionne dans chaque page le div avec l'id 'primary_block' (c'est souvent là que se trouvent les infos du produit)
        sel = Selector(response)
        sites = sel.xpath('//div[@id="primary_block"]')
        items = []
       
# enfin on recupere les infos, les chemins xpath sont des exemples souvent rencontrés sur des sites prestashop
        for site in sites:
            item = MyItems()
            item['DEEPLINK'] = response.url
            item['FULL_NAME'] = site.xpath('//h1/text()').extract()
            item['PRICE'] = site.xpath('//span[@id="our_price_display"]/text()').extract()
            item['IMAGE'] = site.xpath('//img[@id="bigpic"]/@src').extract()
         
            items.append(item)

     
        return items
 


Et voilà, ensuite pour le lancer et recuperer le butin dans un fichier csv on utilise l'invit de commande :  on se deplace dans le dossier du projet (exemple : cd Desktop/mon_projet) et on tape :


scrapy crawl mon-robot -o resultats.csv -t csv
 

Et le tour est joué big_smile

Si vous avez des idées pour l'améliorer ou si vous savez comment faire pour traiter directement les infos obtenues  je suis preneur ! ( pour l'instant j'importe manuellement le fichier dans une bdd et j'utilise des requetes sql pour faire le tri )

Hors ligne

#2 2014-05-11 16:15:17

Mention Soul
Soldier
Lieu : Annecy
Inscription : 2013-01-02
Messages : 569

PHP
Netlinking Auto
Advertising
Site Web

Re : Petit crawler scrapy

Pour l'intégration de mysql : http://stackoverflow.com/questions/1084 … r-10849394

J'ai fais l'intégration de ArangoDB si besoin wink


CeKwa ?

Hors ligne

#3 2014-05-12 13:57:33

Mention em1xam
Recruit
Inscription : 2014-03-17
Messages : 11

Re : Petit crawler scrapy

Merci pour le retour ! Je vais voir ça de plus près smile

Hors ligne

#4 2014-05-12 14:05:09

Mention razbithume
Soldier
Inscription : 2013-09-17
Messages : 827

Audit et Analyse
Scraping
Marketing
Site Web

Re : Petit crawler scrapy

merci, c'est typiquement ce que je cherche à faire mais pas eu trop le temps de pousser le truc jusqu'à maintenant.

Par contre, je complèterai avec la gestion des proxy.
J'ai vu des bouts de code par ici : http://mahmoud.abdel-fattah.net/2012/04 … h-proxies/ ou par là http://mahmoud.abdel-fattah.net/2012/04 … y-proxies/ .


Vive les regex et le xpath !

Hors ligne

Pied de page des forums