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