【问题标题】:Scrapy pipelines order is jumbled when a particular pipeline is included当包含特定管道时,Scrapy 管道顺序混乱
【发布时间】:2014-03-23 14:53:33
【问题描述】:

我有 6 个管道,在 settings.py 中定义如下:

ITEM_PIPELINES = {
    'SiteCrawler.pipelines.DuplicatesPipeline': 100,
    #'SiteCrawler.pipelines.ScreenshotPipeline': 200,
    'SiteCrawler.pipelines.NodesPipeline': 300,
    'SiteCrawler.pipelines.EdgesPipeline': 400,
    'SiteCrawler.pipelines.ParentsPipeline': 500,
    'SiteCrawler.pipelines.TextAnalysisPipeline': 600,
}

当像这样省略屏幕截图管道时,管道以正确的顺序运行。我知道这一点,因为我会在使用每个管道时进行记录。创建订单的方法是the one suggested in the documentation。但是,当我包含屏幕截图管道时,顺序变得混乱。 1,3,4,5,6 变为 6,4,2,5,3,1。我需要它们的顺序正确。

这是 Screenshots 管道的代码,以防万一其中有任何解释:

class ScreenshotPipeline(object):

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_opened(self, spider):
        self.date = spider.unix_date
        self.domain = spider.scrape_domain
        self.driver = webdriver.PhantomJS(executable_path=phantomjs_path)
        self.driver.set_page_load_timeout(15)

    def process_item(self, item, spider):
        log.msg("screenshot")
        try:
            self.driver.get(item['url_obj'].full)
        except:
            self.driver = webdriver.PhantomJS(executable_path=phantomjs_path)
            self.driver.set_page_load_timeout(15)
            self.driver.get(item['url_obj'].full)
        WebDriverWait(self.driver, timeout=2)
        self.driver.save_screenshot(r"{0}\initiator\static\scrapes\{1}\{2}\{3}.png".format(getcwd(), self.domain, self.date, item['url_obj'].name))
        return item

    def spider_closed(self, spider):
        pass

感谢您的帮助。

【问题讨论】:

    标签: python-2.7 web-scraping scrapy


    【解决方案1】:

    我对管道也有同样的问题。它们不是根据 ITEM_PIPELINES 字典中给出的索引排序的。我重命名了管道,奇怪的是,执行顺序发生了变化。但是,它仍然不是正确的顺序。

    最后,我将 ITEM_PIPELINES 从字典更改为列表(按照所需的执行顺序),并且成功了。根据documentation

    Lists are supported in ITEM_PIPELINES for backwards compatibility, but they are deprecated.
    

    因此,您可以尝试按如下方式设置管道(只要继续支持列表):

    ITEM_PIPELINES = [
        'SiteCrawler.pipelines.DuplicatesPipeline',
        'SiteCrawler.pipelines.ScreenshotPipeline',
        'SiteCrawler.pipelines.NodesPipeline',
        'SiteCrawler.pipelines.EdgesPipeline',
        'SiteCrawler.pipelines.ParentsPipeline',
        'SiteCrawler.pipelines.TextAnalysisPipeline',
    ]
    

    【讨论】:

    • 问题有时仍然会出现,但不幸的是这在 Python 3 - Scrapy 1.8 中不起作用。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多