Я хочу объединить элементы, где я получаю элементы с сайта 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
Куда поместить эту логику?
Я не могу использовать конвейер элементов, потому что мне нужно выдать несколько элементов для очистки временного хранилища.Я понимаю, что конвейер предметов может вернуть ровно ноль или один предмет, но не больше.
Я мог бы построить паука, который знает, как очистить оба сайта.Я мог бы поместить логику в паука.
Я мог бы создать собственный экстрактор и поместить туда логику.