使用scrapy的项目加载器填充数据可在Shell中工作,但不能在Spider中工作

时间:2018-10-09 00:28:29

标签: python scrapy

我有以下由三个文件组成的简单蜘蛛。 我的目标是正确使用项目加载器来填充我当前正在抓取的数据。 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()

如果我手动执行此操作,然后将Spider的代码精确复制到外壳中,那么我将完全填充所需的内容。 Xpath肯定是正确的,因为它已经是一个硬编码且功能强大的蜘蛛,我想使用管道和项目加载器对其进行优化。我无法到达有明显错误的地方。它看起来非常简单。任何想法欢迎。

2 个答案:

答案 0 :(得分:2)

您使用的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()

答案 1 :(得分:0)

也许您应该检查ItemLoader中写的spider.py。我认为,也许您可​​以检查您的日志文件。 @BoobaGump使用CrawlSpider,而parse_itemparse的名称不同,这是正确的@Granitosaurus。警告Crawling Rules已指定:

  

警告

     

在编写爬网蜘蛛规则时,请避免将解析用作回调,因为CrawlSpider使用解析方法本身来实现其逻辑。因此,如果您覆盖了parse方法,则爬网蜘蛛将不再起作用。

当我使用ItemLoader时,可以在日志中看到项目,但是在外壳程序中却没有得到项目。