0
votes

Scrapy - pymongo n'insère pas d'articles dans la base de données

Je joue donc avec scrapy en essayant d'apprendre, et en utilisant MongoDB comme mon DB ive aboutit à une impasse. Fondamentalement, le grattage fonctionne comme les éléments que je récupère sont affichés dans le journal du terminal, mais je ne peux pas obtenir les données à publier sur ma base de données. Le MONGO_URI est correct car je l'ai essayé dans le shell python où je peux créer et stocker des données.

Voici mes fichiers

items.py

materials
  spiders
  my-spider
items.py
pipelines.py
settings.py

spider.py

import pymongo

class MongoPipeline(object):

    collection_name = 'my-prices'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        ## pull in information from settings.py
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DB', ', <placeholder-spider name>')

        )

    def open_spider(self, spider):
        ## initializing spider
        ## opening db connection
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        ## clean up when spider is closed
        self.client.close()

    def process_item(self, item, spider):
        ## how to handle each post
        self.db[self.collection_name].insert(dict(item))
        logging.debug("Post added to MongoDB")
        return item

settings.py

MONGO_PIPELINES = {
    'materials.pipelines.MongoPipeline': 300,
}


#setup mongo DB
MONGO_URI = "my MongoDB Atlas address"
MONGO_DB = "materials"

pipelines.py

import scrapy
from scrapy.selector import Selector

from ..items import MaterialsItem

class mySpider(scrapy.Spider):
    name = "<placeholder for post>"
    allowed_domains = ["..."]
    start_urls = [
   ...
    ]

    def parse(self, response):
        products = Selector(response).xpath('//div[@class="content"]')

        for product in products:        
                item = MaterialsItem()
                item['title'] = product.xpath("//a[@class='product-card__title product-card__title-v2']/text()").extract(),
                item['price'] = product.xpath("//div[@class='product-card__price-value ']/text()").extract()
               ## product['url'] = 
                yield item

N'importe quelle aide serait formidable!

** Modifier

la structure des fichiers

import scrapy

class MaterialsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    price = scrapy.Field()
   ## url = scrapy.Field()
    pass


0 commentaires

3 Réponses :


0
votes

ne devrait pas la ligne dans la classe Mongopipeline: xxx

soit: xxx

puisque vous appelez: < Pré> xxx


1 commentaires

Bien que cela semble correct, cela ne fonctionne pas dans cet exemple pour moi .. Ceci est l'exemple de scrapy pour pipeline vers mongodb que je viens de modifier avec mes propres données. J'ai essayé d'ajouter self.colection_name comme vous l'avez suggéré mais je casse le code.



0
votes

Je l'ai compris, avec une tête fraîche, j'ai tout réexaminé. Il s'avère que dans les paramètres, j'ai dû modifier le

ITEM_PIPELINES = {
    'materials.pipelines.MongoPipeline': 300,
}

en

MONGO_PIPELINES = {
    'materials.pipelines.MongoPipeline': 300,
}

Je suppose que je n'aurais pas dû changer le format de dénomination, de ITEM_PIPELINES à MONGO_PIPELINES .


0 commentaires

0
votes

Quelle erreur de code et je pense avoir besoin de perdre init si cela possible pouvez-vous le télécharger en git? et je pourrais essayer d'avoir un look


1 commentaires

Merci mais comme ci-dessus, je pense que mon problème est résolu, était une règle mal nommée dans les paramètres :)