在变量中获取Scrapy spider的结果



我尝试运行Scrapy spider和一些SDK调用到Django中的另一个资源。主要思想是在一个列表中收集它们的结果,一旦它准备好并输出它以查看。SDK以同步方式工作,所以没有问题。但我无法从蜘蛛身上得到结果。有人能告诉我正确的解决方法吗?

我运行解析的代码是这样的:

class scrapyParser(Parser):
def __init__(self, keywords=None, n_items=None):
super().__init__(keywords, n_items)
def parse(self):
result = []
if not super().parse():
return False

crawler = UrlCrawlerScript(Parser1, result, [BASE_PATH + self.keywords])
crawler.start()
crawler.join()
print(crawler.outputResponse)
return result[:self.n_items]

class UrlCrawlerScript(Process):
def __init__(self, result, urls):
Process.__init__(self)
settings = get_project_settings()
self.crawler = Crawler(spider, settings=settings)
self.crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
self.spider = spider
self.urls = urls
self.outputResponse = result
@inlineCallbacks
def cycle_run(self):
yield self.crawler.crawl(Parser1, outputResponse=self.outputResponse, start_urls=self.urls)
returnValue(self.outputResponse)

def run(self):
result = self.cycle_run()
result.addCallback(print)

reactor.run()

解析代码非常简单,它有这样一个模板:

import scrapy
class Parser1(scrapy.Spider):
name = 'items'
allowed_domains = ['domain.com']
def parse(self, response):
...
# parsing page
for item in row_data:
scraped_info = {
...
}
self.outputResponse.append(scraped_info)

所以我不能在parse的输出中得到任何东西。它返回一个空列表。然而,我在Python和Twisted框架中才刚刚开始使用异步调用。很有可能我把什么东西搞砸了。

在做了很多不同的代码片段并寻找了SO答案后,我终于找到了一个简单而优雅的解决方案。使用scrapyscript。

class scrapyParser(Parser):
def __init__(self, keywords=None, n_items=None):
super().__init__(keywords, n_items)
def parse(self):
result = []
if not super().parse():
return False
processor = Processor(settings=None)
job1 = Job(Parser1, url=URL1 + self.keywords)
job2 = Job(Parser2, url=URL2 + self.keywords)
return processor.run([job1, job2])

来源:https://stackoverflow.com/a/62902603/1345788

最新更新