Scrapy: объединяйте предметы с разных сайтов - PullRequest
0 голосов
/ 01 октября 2018

Я хочу объединить элементы, где я получаю элементы с сайта A и элементы с сайта B.

Элементы A и B разделяют некоторые поля, которые позволяют мне сопоставлять элементы.В противном случае у каждого есть поля, которые являются уникальными для A или B.

Я хочу объединить эти элементы на основе корреляции, создавая элементы, содержащие

  • общих полей,
  • поля, уникальные для A, и
  • поля, уникальные для B.

Элементы, уникальные для A или B, должны пройти без изменений.

I не может предположить:

  • элементы на A и B находятся в одинаковом порядке
  • каждый элемент A имеет соответствующий элемент B
  • каждый элемент B имеетсоответствующий предмет A

Как бы я сделал это в Scrapy?Имеет ли смысл делать это в Scrapy или лучше на этапе постобработки?

Мысли о реализации:

Поскольку я не могу принять порядок, мне нужно временное хранилище.Я смотрю на <1000 элементов, поэтому временное хранение в памяти представляется возможным. </p>

Псевдокод:

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 голосов
/ 01 октября 2018

Для этого варианта использования Сорта я считаю, что постобработка - это самый простой, простой и надежный путь.Это также упростит задачу, если позже вам потребуется выполнить какую-либо дополнительную постобработку / агрегацию.

  • Теоретически вы можете сделать так, чтобы ваш конвейер просто буферизовал элементы и регулярно сбрасывал их в любое хранилище, которое вы используете напрямую.,Но дело в том, что для того, чтобы конвейер / промежуточное ПО могло видеть элементы, распределенные по нескольким паукам, вам нужно было бы спроектировать их так, чтобы они использовали какое-то общее хранилище, поскольку механизм Scrapy - это только один паук.
  • Один паукРешение - это хороший вариант, я думаю, но не самый элегантный, плюс, насколько я знаю, нет простого способа получить предметы после того, как паук закончил, так что это должно быть реализовано как дополнительный взлом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...