我想合并从站点 A 和从站点 B 获取项目的项目。
A 项目和 B 项目共享一些字段,这些字段允许我关联项目。否则,每个字段都有 A 或 B 独有的字段。
我想根据相关性合并这些项目,创建包含
的项目- 共享字段,
- A 独有的字段,以及
- B 独有的字段。
A 或 B 独有的项目应原封不动地通过。
我不能假设:
- A 和 B 上的项目顺序相同
- 每个A项都有对应的B项
- 每个 B 项都有对应的 A 项
我如何在 Scrapy 中做到这一点?在 Scrapy 中做或在后处理步骤中做更好有意义吗?
实现思路:
因为我不能接受订单,所以我需要一个临时商店。我正在查看 <1000 个项目,因此内存中的临时存储似乎是可行的。
伪代码:
A_items = list() # in-memory temp storage
for A_item in A_site:
A_items.append(A_item)
for B_item in B_site:
for A_item in A_items:
if is_correlated(A_item, B_item):
AB_item = merge(A_item, B_item)
A_items.remove(A_item)
yield AB_item
else:
yield B_item # B_item without A_item
# remaining A_items, for which we did not find a B_item
for A_item in A_items:
yield A_item
把这个逻辑放在哪里?
我不能使用项目管道,因为我需要生成多个项目 用于清空临时存储。我了解项目管道可以 恰好返回零个或一个项目,但不能更多。
我可以构建一个知道如何抓取这两个站点的蜘蛛。我可以 将逻辑放入蜘蛛。
我可以构建自定义提取器并将逻辑放在那里。
最佳答案
对于这类用例,我认为后处理是最简单、最直接和可靠的途径。如果您以后必须进行任何额外的后处理/聚合,也会使事情变得更容易。
- 理论上,您可以让管道只缓冲项目并定期将它们刷新到您直接使用的任何存储中。但问题是,为了让管道/中间件看到跨多个爬虫产生的项目,您必须将它们设计为使用某种共享存储,因为 scrapy 引擎只是一个爬虫。
- 我认为一个蜘蛛解决方案是一个不错的选择,但不是最优雅的选择,而且据我所知,在蜘蛛完成后没有直接的方法来生成项目,因此必须作为额外的 hack 来实现。
关于python - Scrapy:合并来自不同站点的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52590532/