gpt4 book ai didi

python - Scrapy 将数据返回/传递给另一个模块

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:19 27 4
gpt4 key购买 nike

您好,我想知道如何将 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)))

在 main 方法中打印的值为 0,而在 parse 方法中为 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()

最佳答案

这种行为的主要原因是 Scrapy 本身的异步特性。 print(len(spider1.result)) 行将在调用 .parse() 方法之前执行。

有多种方法可以等待蜘蛛完成。我会做 spider_closed signal :

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()

关于python - Scrapy 将数据返回/传递给另一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52080024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com