Python 在scrapy中转换最终输出?
我有一个可以成功解析项和子项的粗略过程,但是我看不出是否有最终的钩子,它允许我在解析完所有内容之后,但在格式化为输出之前,转换最终的数据结果 我的蜘蛛正在做这样的事情:Python 在scrapy中转换最终输出?,python,scrapy,Python,Scrapy,我有一个可以成功解析项和子项的粗略过程,但是我看不出是否有最终的钩子,它允许我在解析完所有内容之后,但在格式化为输出之前,转换最终的数据结果 我的蜘蛛正在做这样的事情: class MySpider(scrapy.Spider): def parse(self, response, **kwargs): for part in [1,2,3]: url = f'{response.request.url}?part={part}'
class MySpider(scrapy.Spider):
def parse(self, response, **kwargs):
for part in [1,2,3]:
url = f'{response.request.url}?part={part}'
yield scrapy.Request(url=url, callback=self.parse_part, meta={'part': part})
def parse_part(self, response, **kwargs)
# ...
for subpart in part:
yield {
'title': self.get_title(subpart),
'tag': self.get_tag(subpart)
}
}
这工作得很好,但在将其输出到json(或其他)之前,我还没有弄清楚在哪里可以获得完整的结果结构并对其进行转换。我想也许我可以在中间件的
过程\u spider\u输出调用中这样做,但这似乎只给了我单个项目,而不是最终的结构。在spider关闭后,您可以使用此方法做一些事情:
def spider_closed(self):
但是,您将无法修改方法中的项。要修改项目,您需要编写自定义管道。在管道中,您编写了一个方法,每次spider生成一个项时都会调用该方法。因此,在该方法中,您可以将所有项目保存到列表中,然后通过管道方法close\u spider
示例:
假设您希望将所有项目都作为JSON,以便向API发送请求。您必须在settings.py
中激活管道才能使用它
import json
class MyPipeline:
def __init__(self, *args, **kwargs):
self.items = []
def process_item(self, item, spider):
self.items.append(item)
return item
def close_spider(self, spider):
# In the method to can itterate self.items and transform them to your preference.
json_data = json.dumps(self.items)
print(json_data)
我希望能够将输出转换为提要导出,但是我找不到任何文档来说明这是否可行。事实上,如果在scrapy中没有挂钩,这看起来管道是最好的解决方案。