Scrapy: использование нескольких полей изображения, сохранение результатов - PullRequest
0 голосов
/ 20 декабря 2018

Я использую скрапу для захвата нескольких изображений.Я сохраняю их в отдельных полях.Из-за зависимостей от других систем я не хочу, чтобы все результаты изображений (URL, путь, контрольная сумма) сохранялись в одном поле.

  • image_url1
  • image_url2

Результаты (URL, путь, контрольная сумма) хранятся в;

  • images1
  • images2

Наконец-то у меня все работает, где оноскачивает 2 картинки.Результаты для image_url1 хранятся в images1.Только он не сохраняет результаты для image_url2 в images2.Я не знаю, как я понимаю, что результаты для image_url2 должны быть сохранены в images2.Если я сейчас запусту следующий код, он попытается сложить вместе 2 результата (url, path, checkum) (результаты image_url1 и image_url2 друг за другом разделены пробелом).Он не может вставить это поле в MySQL, так что происходит сбой.

class GooutImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_url1']:
            yield scrapy.Request(image_url)
        for image_url in item['image_url2']:
            yield scrapy.Request(image_url)

Я уже сделал следующие изменения в настройках;

IMAGES_URLS_FIELD = 'image_url1'
IMAGES_RESULT_FIELD = 'images1'

Я не могу найти ничего, как работать с несколькими изображениямиполя.

*** Редактировать / Решение после обратной связи После предложения сделать это в item_completed, я придумываю следующее:

class GooutImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        if item['image_url1']:
            for image_url in item['image_url1']:
                yield scrapy.Request(image_url)
        if item['image_url2']:
            for image_url in item['image_url2']:
                yield scrapy.Request(image_url)

    def item_completed(self, results, item, info):
        for download_status, result in results:
            if result['url'] == item['image_url1'][0]:
                item['images1'] = result['path']
            if result['url'] ==  item['image_url2'][0]:
                item['images2'] = result['path']
        return item

Не знаю, является ли это лучшим способомсделай это, но это работает.Обратная связь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 20 декабря 2018

Метод item_completed () предназначен для хранения данных, поэтому вам необходимо переопределить его.

Вам необходимо знать, где хранить данные, чтобы выВозможно, вы захотите добавить эту информацию к meta запросу, который вы создаете в get_media_requests().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...