Заполнение данных с помощью загрузчика элементов Scrapy работает в оболочке, но не в пауке - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий простой паук, состоящий из трех файлов.Моя цель - правильно использовать загрузчик элементов, чтобы заполнить данные, которые я сейчас отбрасываю.pipeline.py является простым создателем файла json, как описано в документации по scrapy.

items.py

from scrapy.loader import ItemLoader

class FoodItem(scrapy.Item):
    brand = scrapy.Field(
        input_processor=TakeFirst(),
        output_processor=Identity()
    )
    name = scrapy.Field(
        input_processor=TakeFirst(),
        output_processor=Identity()
    )

    description = scrapy.Field(
        input_processor=TakeFirst(),
        output_processor=Identity()
    )

    last_updated = scrapy.Field()

spider.py

class MySpider(CrawlSpider):
    name = 'Test'
    allowed_domains = ['zooplus.fr']    
    start_urls = [
    'https://www.zooplus.fr/shop/chats/aliments_specifiques_therapeutiques_chat/problemes_urinaires_renaux_chat/croquettes_therapeutiques_chat/595867',
    ]


    def parse_item(self, response):

        l = ItemLoader(item=PetfoodItem(),response=response)
        l.add_xpath('brand', '//*[@id="js-breadcrumb"]/li[4]/a/span/text()')
        l.add_xpath('name', '//*[@id="js-product__detail"]/div[1]/div[2]/div[1]/h1/text()')
        l.add_xpath('description', '//*[@id="js-product__detail"]/div[1]/div[2]/div[1]/div[1]/meta/@content')
        l.add_value('url', response.url)
        l.add_value('last_updated', 'today')

        l.load_item()

        return l.load_item()

Если я делаю это вручную и точно копирую код паука в оболочку, я точно заполняючто я хочу.Xpath наверняка прав, потому что это уже жестко закодированный и функциональный паук, который я хочу усовершенствовать, используя конвейеры и загрузчик элементов.Я не могу понять, где есть очевидная ошибка.Это выглядит довольно просто, хотя.Любые идеи приветствуются.

1 Ответ

0 голосов
/ 09 октября 2018

Вы используете CrawlSpider неправильно.

Если вы хотите сканировать один продукт, просто придерживайтесь исходного Spider базового класса:

* изменения помечены ^

class MySpider(Spider):
    #          ^^^^^^
    name = 'zooplus'
    allowed_domains = ['zooplus.fr']
    start_urls = [
        'https://www.zooplus.fr/shop/chats/aliments_specifiques_therapeutiques_chat/problemes_urinaires_renaux_chat/croquettes_therapeutiques_chat/595867',
    ]

    def parse(self, response):
    #   ^^^^^
        l = ItemLoader(item=dict(), response=response)
        l.add_xpath('brand', '//*[@id="js-breadcrumb"]/li[4]/a/span/text()')
        l.add_xpath('name', '//*[@id="js-product__detail"]/div[1]/div[2]/div[1]/h1/text()')
        l.add_xpath('description', '//*[@id="js-product__detail"]/div[1]/div[2]/div[1]/div[1]/meta/@content')
        l.add_value('url', response.url)
        l.add_value('last_updated', 'today')
        return l.load_item()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...