【问题标题】:Scrapy: merge items from different sitesScrapy:合并来自不同站点的项目
【发布时间】:2018-10-01 11:53:53
【问题描述】:

我想合并从站点 A 获取项目和从站点 B 获取项目的项目。

A 项目和 B 项目共享一些允许我关联项目的字段。否则,每个字段都有 A 或 B 独有的字段。

我想根据相关性合并这些项目,创建包含

的项目
  • 共享字段,
  • A 独有的字段,以及
  • B 独有的字段。

A 或 B 独有的项目应原样通过。

不能假设:

  • A 和 B 上的项目顺序相同
  • 每个 A 项都有对应的 B 项
  • 每个 B 项都有对应的 A 项

我将如何在 Scrapy 中做到这一点?在 Scrapy 中做还是在后处理步骤中做得更好?

实施思路:

因为我不能接受订单,所以我需要一个临时商店。我正在查看

伪代码:

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

把这个逻辑放在哪里?

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

  • 我可以构建一个蜘蛛,它知道如何抓取两个站点。我可以 将逻辑放入蜘蛛中。

  • 我可以构建一个自定义提取器并将逻辑放在那里。

【问题讨论】:

  • 我会单独做这个。

标签: python scrapy


【解决方案1】:

对于这种用例,我认为后处理是最简单、最直接和最可靠的途径。如果您以后必须进行任何额外的后期处理/聚合,也会使事情变得更容易。

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

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多