Scrapy - 在解析回调之外生成项目

Scrapy - generating items outside of parse callback

这可能有点奇怪。我有一个 Scrapy 项目,其中包含一些继承自 CrawlSpider 的蜘蛛。除了它们的正常执行(通过预期的网站),我还希望能够 将项目推送到原始回调的范围之外

我定义了一个线程,它遍历文件夹中的文件,然后将它们传递给 parse_files,就好像它是由 Scrapy 下载的内容一样。有什么方法可以通过我拥有的管道和中间件获取从中生成的项目,就好像它只是另一个下载的页面一样?

我知道这不是他们想要的架构,但我想知道我是否可以解决这个问题。我熟悉 Scrapy 的架构,基本上是在寻找一种将项目推送到引擎的好方法。

class SomeSpider(CrawlSpider):
name = "generic_spider"

def __init__(self):
    CrawlSpider.__init__(self, instance_config)
    self.file_thread = Thread(target=self._file_thread_loop)
    self.file_thread.daemon = True
    self.file_thread.start()

    self.rules += (Rule(LxmlLinkExtractor(allow=['/somepath/'], deny=[], callback=self.parse_items, follow=True),)

def _file_thread_loop(self):
    while True:
    #... read files...
        for file in files:
            response = HtmlResponse(url=file['url'], body=file['body'])
            for item in self.parse_items(response):
                yield item # <-- I want this to go to the pipelines and middlewares

        time.sleep(10)


def parse_items(self, response):
    hxs = Selector(response)

    # ... parse page ...
    for item in resulting_items:
        yield item    

我不确定是否有办法将项目直接推送到引擎,但你可以做的是将虚拟请求与元变量中的项目一起推送,然后在回调中产生它们。

def _file_thread_loop(self):
    while True:
    #... read files...
        for file in files:
            response = HtmlResponse(url=file['url'], body=file['body'])
            req = Request(
                url='http://example.com',
                meta={'items': self.parse_items(response)},
                callback=self.yield_item
            )
            self.crawler.engine.crawl(req, spider=self)

        time.sleep(10)


def yield_item(self, response):
    for item in response.meta['items']:
        yield item