python - 蜘蛛完成后返回scrapy项目
问题描述
是否有可能以某种方式抓取一些项目,将它们保存到列表中,当蜘蛛完成后,所有项目都将返回以进行管道管理。我已经尝试使用下面的代码进行类似的操作,但它不起作用,因为 Scrapy 不希望在函数中返回项目Spider.closed()
。
我需要这样做,因为我抓取了两个具有共同产品的搜索列表并从中提取数据,因此我希望将两个不同搜索列表中的相同产品保存在一个项目中。
我之前已经解决了这个问题,方法是在每个函数之后运行一些函数parse()
来检查另一个解析是否完成。但这带来了一些意想不到的结果。
class MySpider(scrapy.Spider):
items = []
def parse(self, response):
...
newitem = Item()
self.items.append(newitem)
def closed(self, reason):
for item in self.items:
yield item
解决方案
找到了一个解决方案,也有点hacky,但它有效。不过,这可能不是最好的解决方案,因为scrape 似乎不会重新处理已处理的项目。可能对以后的部署产生影响。
class MySpider(scrapy.Spider):
name = 'myspider'
items = []
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
from_crawler = super(MySpider, cls).from_crawler
spider = from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle)
return spider
def idle(self):
itemproc = self.crawler.engine.scraper.itemproc
for item in self.items:
itemproc.process_item(item, self)
推荐阅读
- android - Android应用程序崩溃而logcat中没有任何错误
- c++ - 将生产者/消费者与屏障同步
- javascript - Promise.all 引发 TypeError: undefined is not a function
- c# - yamldotnet 合并2个yaml文件(深度合并功能)
- flutter - 如何在颤动中使用图像而不是图标?
- c# - 如何在列表视图时间列中选择日期的最新时间值
- angular - 角度项目中垫选择的异常行为
- dart - 如何将颤振 TimeOfDay 转换为 DateTime?
- php - 在 Eloquent 中使用 avg 编写 groupby 记录
- java - 提醒通知不显示