首页 > 解决方案 > 项目在 Python / Scrapy 中屈服时失去了名字

问题描述

在 Python 3.8.x 上的 Scrapy 2.4.x 中,我正在生成一个项目,目的是将一些统计信息保存到数据库中。刮板还有另一个项目也可以产生。

虽然项目的名称出现在主脚本“StatsItem”中,但它在其他类中丢失了。我使用项目的名称来决定调用哪个方法:

在 scraper.py 中:

import scrapy
from crawler.items import StatsItem, OtherItem

class demo(scrapy.Spider):

    def parse_item(self, response):
       stats = StatsItem()
       stats['results'] = 10
       yield stats

       print(type(stats).__name__)
       # Output: StatsItem

       print(stats)
       # Output: {'results': 10}

在管道.py

import scrapy
from crawler.items import StatsItem, OtherItem

class mysql_pipeline(object):

    def process_item(self, item, spider):

        print(type(item).__name__)
        # Output: NoneType

        if isinstance(item, StatsItem):
            self.save_stats(item, spider)

        elif isinstance(item, OtherItem):
            # call other method

        return item

第一个类中 print 的输出是“StatsItem”,而在管道中它是“NoneType”,因此方法 save_stats() 永远不会被调用。

我对 Python 很陌生,所以可能有更好的方法来做到这一点。我知道没有错误消息或异常。任何帮助是极大的赞赏。

标签: pythonscrapy

解决方案


您不能yield在函数 imo 之外使用。


推荐阅读