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

时间:2015-02-24 15:18:23

标签: python scrapy scrapy-spider

这可能有点奇怪。我有一个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    

1 个答案:

答案 0 :(得分:1)

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

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