Scrapy вернуть / передать данные в другой модуль - PullRequest
0 голосов
/ 29 августа 2018

Привет, мне интересно, как я могу передать результат очистки, который является файлом pandas, в модуль, который создал паука.

import mySpider as mspider
def main():
    spider1 = mspider.MySpider()
    process = CrawlerProcess()
    process.crawl(spider1)
    process.start()
    print(len(spider1.result))

Паук:

class MySpider(scrapy.Spider):
    name = 'MySpider'
    allowed_domains = config.ALLOWED_DOMAINS
    result = pd.DataFrame(columns=...)

    def start_requests(self):
        yield Request(url=...,headers=config.HEADERS, callback=self.parse)

    def parse(self, response):
        *...Some Code of adding values to result...*
        print("size: " + str(len(self.result)))

Напечатанное значение в основном методе равно 0 , когда в методе анализа - 1005 . Не могли бы вы сказать мне, как я должен передавать значение между.

Я бы хотел сделать это, потому что у меня несколько пауков. После того, как они закончат очистку, я объединю и сохраню в файл.

РЕШЕНИЕ

def spider_closed(spider, reason):
    print("Size" + str(len(spider.result)))

def main():
    now = datetime.now()
    spider1 = spider.MySpider()
    crawler_process = CrawlerProcess()
    crawler = crawler_process.create_crawler(spider1)
    crawler.signals.connect(spider_closed, signals.spider_closed)
    crawler_process.crawl(spider1)
    crawler_process.start()

1 Ответ

0 голосов
/ 29 августа 2018

Основная причина такого поведения - асинхронная природа самой Scrapy. Строка print(len(spider1.result)) будет выполнена до вызова метода .parse().

Есть несколько способов дождаться окончания паука. Я бы сделал spider_closed сигнал :

from scrapy import signals


def spider_closed(spider, reason):
    print(len(spider.result))

spider1 = mspider.MySpider()

crawler_process = CrawlerProcess(settings)
crawler = crawler_process.create_crawler()

crawler.signals.connect(spider_closed, signals.spider_closed)

crawler.crawl(spider1)
crawler_process.start()
...