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