我有一个项目,它有一个排名字段,必须通过分析其他项目类来构建。我不想使用数据库或其他后端来存储它们——我只需要访问所有当前抓取的项目并对它们做一些 itertools 魔法——在蜘蛛完成之后但在我们导出数据之前我怎么能做到这一点(所以排名字段赢了'不是空的)?
问问题
1910 次
3 回答
4
我认为信号可能会有所帮助。我在这里做了类似的事情
https://github.com/dm03514/CraigslistGigs/blob/master/craigslist_gigs/pipelines.py
这似乎有点 hacky,但在你的蜘蛛中,你可以创建一个属性来存储你所有的 Scraped 项目。在您的管道中,您可以注册一个在蜘蛛关闭信号上调用的方法。此方法将蜘蛛实例作为参数。然后,您可以访问包含所有已抓取项目的蜘蛛属性
于 2012-10-07T13:50:01.937 回答
1
此管道将确保所有项目都有一个等级。
class MyPipeline(object):
def process_item(self, item, spider):
item['rank'] = item.get('rank') or '1'
return item
于 2012-10-13T02:30:51.517 回答
0
您可以使用Extensions和Signals收集所有抓取的项目。
from scrapy import signals
class ItemCollectorExtension:
def __init__(self):
self.items = []
@classmethod
def from_crawler(cls, crawler):
extension = cls()
crawler.signals.connect(extension.add_item, signal=signals.item_scraped)
crawler.signals.connect(extension.spider_closed, signal=signals.spider_closed)
return extension
def spider_closed(self):
print(self.items) # Replace with your code
def add_item(self, item):
self.items.append(item)
现在,每次成功抓取新项目时,都会将其添加到self.items
. 当所有项目都收集完毕并且蜘蛛正在关闭时,spider_closed
调用该函数。在这里,您可以访问所有收集的项目。
不要忘记在settings.py
.
于 2021-08-29T22:19:22.037 回答