Scrapy - pymon go не вставляет элементы в БД - PullRequest
0 голосов
/ 13 февраля 2020

Так что я играю со скрапами, пытающимися учиться, и использую MongoDB в качестве моей БД, я зашел в тупик. По сути, работа по очистке выполняется, когда элементы, которые я получаю, отображаются в журнале терминала, но я не могу получить данные для публикации sh в моей БД. MONGO_URI правильно, как я пытался в оболочке python, где я могу создавать и хранить данные ..

Вот мои файлы

items.py


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

spider.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

settings.py

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


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

pipelines.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

Любая помощь будет отличной!

* * Редактировать

структура файла

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

Ответы [ 3 ]

0 голосов
/ 14 февраля 2020

Я разобрался, с головой sh я снова все осмотрел. Оказывается, в настройках мне пришлось отредактировать

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

до

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

Я думаю, мне не следовало менять формат именования с ITEM_PIPELINES на MONGO_PIPELINES.

0 голосов
/ 14 февраля 2020

что за ошибка в коде, и я думаю, что мне нужно написать init , если это возможно, вы можете загрузить ее на git? и я мог бы попытаться взглянуть

0 голосов
/ 13 февраля 2020

Не должно ли строка в классе MongoPipeline:

collection_name = 'my-prices'

быть:

self.collection_name = 'my-prices'

, поскольку вы звоните:

self.db[self.collection_name].insert(dict(item))
...