web-dev-qa-db-fra.com

Scrapy: comment utiliser les éléments dans Spider et comment envoyer des éléments aux pipelines?

Je suis nouveau dans scrapy et ma tâche est simple:

Pour un site e-commerce donné:

  • explorer toutes les pages du site Web

  • chercher la page des produits

  • Si l'URL pointe vers une page de produit

  • Créer un article

  • Traiter l'élément pour le stocker dans une base de données

J'ai créé l'araignée mais les produits sont simplement imprimés dans un fichier simple.

Ma question concerne la structure du projet: comment utiliser les éléments dans Spider et comment envoyer des éléments aux pipelines?

Je ne trouve pas d'exemple simple de projet utilisant des éléments et des pipelines.

14
farhawa
  • Comment utiliser des objets dans mon araignée?

Eh bien, l'objectif principal des éléments est de stocker les données que vous avez explorées. scrapy.Items sont essentiellement des dictionnaires. Pour déclarer vos objets, vous devrez créer une classe et ajouter scrapy.Field dedans:

import scrapy

class Product(scrapy.Item):
    url = scrapy.Field()
    title = scrapy.Field()

Vous pouvez maintenant l'utiliser dans votre araignée en important votre produit.

Pour des informations avancées, je vous laisse consulter le doc ici

  • Comment envoyer des articles au pipeline?

Tout d'abord, vous devez dire à votre araignée d'utiliser votre custom pipeline.

Dans le fichier settings.py :

ITEM_PIPELINES = {
    'myproject.pipelines.CustomPipeline': 300,
}

Vous pouvez maintenant écrire votre pipeline et jouer avec votre objet.

Dans le fichier pipeline.py :

from scrapy.exceptions import DropItem

class CustomPipeline(object):
   def __init__(self):
        # Create your database connection

    def process_item(self, item, spider):
        # Here you can index your item
        return item

Enfin, dans votre araignée , vous devez yield votre article une fois qu'il est rempli.

spider.py exemple:

import scrapy
from myspider.items import Product

class MySpider(scrapy.Spider):
    name = "test"
    start_urls = [
        'http://www.exemple.com',
    ]
def parse(self, response):
    doc = Product()
    doc['url'] = response.url
    doc['title'] = response.xpath('//div/p/text()')
    yield doc # Will go to your pipeline

J'espère que cela aide, voici le doc pour les pipelines : Item Pipeline

39
Adrien Blanquer