Scrapy:合并来自不同站点的项目

时间:2018-10-01 11:53:54

标签: python scrapy

我想合并从站点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

该逻辑放在哪里?

  • 我无法使用项目管道,因为我需要产生多个项目 用于清空临时存储。我了解项目管道可以 返回正好为零或一项,但不能更多。

  • 我可以建造一个蜘蛛,该蜘蛛知道如何刮擦两个站点。我可以 将逻辑放入蜘蛛。

  • 我应该构建一个自定义提取器并将逻辑放在这里。

1 个答案:

答案 0 :(得分:1)

对于这种排序用例,我认为后处理是最简单,最直接和可靠的途径。如果您以后还要进行任何其他后期处理/汇总,也将使事情变得更容易。

  • 从理论上讲,您可以使管道仅缓冲项目并定期将其刷新到您直接使用的任何存储中。但是事实是,为了使管道/中间件看到跨多个蜘蛛生成的项目,您必须将它们设计为使用某种共享存储,因为scrapy引擎仅是单个蜘蛛。
  • 我认为一个蜘蛛解决方案是一个不错的选择,但不是最优雅的选择,而且据我所知,蜘蛛完成后尚无直接的方法来生产物品,因此必须作为额外的技巧来实现。