Scrapy pipelines Django элемент обновления в базе данных SQLite - PullRequest
0 голосов
/ 21 апреля 2020

В моем проекте Scrapy, связанном с Django, я перебираю страницы с предложениями для рынков жилья и сохраняю в базе данных. В файле конвейеров я создаю уникальный hash_id для каждого элемента и сохраняю другие данные в БД. Каждый раз, когда я хочу обновить базу данных для новых предложений (это работает), а также для закрытых предложений (больше не отображается на странице), меняйте статус в базе данных на «неактивно». Как это сделать, когда process_item работает только для указанного элемента c. Моя идея состояла в том, чтобы собрать все hash_id из db в списке, проверить списанные элементы, если их hash_id присутствуют. Если да, удалите hash_id из списка. Затем обновите статус оставшихся предметов. Но это не работает.

Файл моего конвейера:

def hashed_list():
    hashed_items_db = Offert.objects.filter(still_active = True)
    hashed_list=[item.hash_id for item in hashed_items_db]
    return hashed_list



class ScraperPipeline(object):

    hashed_list = hashed_list()

    def create_hash(self, *args):
      ...
        return data

    def process_item(self, item, spider):
        .....
        hash_id = self.create_hash(args)
        item['hash_id'] = hash_id
        if hash_id not in hashed_list:
            item.save()
        else:
            hashed_list.remove(hash_id)
        return item


    def close_spider(self, spider):

        for hash_item in hashed_list:
            obj =Offert.objects.get(hash_id=hash_item)
            obj.still_active = False
            obj.end_date = timezone.now() - timedelta(days=1)
            obj.save()
        return hashed_list

Как это сделать? Есть ли какой-нибудь простой (??) способ обновить не удаленные элементы в БД?

...