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

标签 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

把这个逻辑放在哪里?

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

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

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

最佳答案

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

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

关于python - Scrapy:合并来自不同站点的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52590532/

相关文章:

python - Scrapy Spider 在同一页面获取两张图片,然后以不同的方式命名它们

python - 如何在 CSS 选择器 scrapy 中使用正则表达式

python - 根据属性将两个人匹配在一起

python - 使用 OpenCV 和 Python 获取图像中颜色的百分比

python - 如何在 Scrapy 框架中使用 RobotsTxtMiddleware?

python - 如何避免在scrapy python中按字母顺序存储字典中的元素

python - python3上的scrapy如何获取在javascript上工作​​的文本数据

Python 和 Unicode : How everything should be Unicode

python - 使用 pandas 从 2 列中提取现有和不存在的值

python - 使用错误(旧)数据库设置的 Django 项目