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
3 Réponses :
ne devrait pas la ligne dans la classe Mongopipeline: soit: p> puisque vous appelez: p> < Pré> xxx pré> p>
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.
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 .
Quelle erreur de code et je pense avoir besoin de perdre
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 :)