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 :)