【问题标题】:Get results of Scrapy spiders in variable在变量中获取 Scrapy 蜘蛛的结果
【发布时间】:2021-08-30 15:19:21
【问题描述】:

我尝试运行 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)

所以我无法在解析的输出中得到任何东西。它返回一个空列表。但是,我在 Python 和 Twisted 框架中的异步调用还处于起步阶段。很有可能我只是搞砸了。

【问题讨论】:

    标签: python-3.x scrapy twisted


    【解决方案1】:

    在做了很多不同的代码 sn-ps 并寻找 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多