2014-12-09 2 views
0

Я могу загружать изображения с помощью scrapy в папку «Полный», но мне нужно сделать динамическое имя папки назначения, например full/session_id, каждый раз, когда запускается scrapy.Как загружать изображения для съемки в динамическую папку?

Есть ли способ сделать это?

+0

Вы должны сообщить нам, как вы в настоящее время загружаете изображения (некоторый код). С промежуточным ПО? От вашего паука? ...? – Aufziehvogel

+0

ya только от моего паука Я включил конвейер и добавлю путь к папке загрузки, как указано в документах – user3706469

+0

Не знал, что в scrapy включены конвейеры. [Ссылка для других] (http://doc.scrapy.org/en/latest/topics/images.html). – Aufziehvogel

ответ

0

Я еще не работал с ImagesPipeline, но following the documentation, я бы переопределил item_completed(results, items, info).

Оригинальное определение:

def item_completed(self, results, item, info): 
    if self.IMAGES_RESULT_FIELD in item.fields: 
     item[self.IMAGES_RESULT_FIELD] = [x for ok, x in results if ok] 
    return item 

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

Если вы сейчас измените этот метод в подклассе, чтобы переместить все файлы перед установкой пути, он должен работать так, как вы хотите. Вы можете установить целевую папку на своем элементе примерно как item['session_path']. Вам нужно будет установить этот параметр для каждого элемента, прежде чем возвращать/убирать предметы из паука.

Подкласс с переопределен метод может выглядеть следующим образом:

import os, os.path 
from scrapy.contrib.pipeline.images import ImagesPipeline 

class SessionImagesPipeline(ImagesPipeline): 
    def item_completed(self, results, item, info): 
     # iterate over the local file paths of all downloaded images 
     for result in [x for ok, x in results if ok]: 
      path = result['path'] 
      # here we create the session-path where the files should be in the end 
      # you'll have to change this path creation depending on your needs 
      target_path = os.path.join((item['session_path'], os.basename(path))) 

      # try to move the file and raise exception if not possible 
      if not os.rename(path, target_path): 
       raise ImageException("Could not move image to target folder") 

      # here we'll write out the result with the new path, 
      # if there is a result field on the item (just like the original code does) 
      if self.IMAGES_RESULT_FIELD in item.fields: 
       result['path'] = target_path 
       item[self.IMAGES_RESULT_FIELD].append(result) 

     return item 

Даже лучше было бы установить нужный путь сеанса не в item, но в конфигурации во время вашего Scrapy перспективе. Для этого вам нужно будет узнать, как настроить конфигурацию во время работы приложения, и вам придется переопределить конструктор, я думаю.

+0

эй, ваша логика кажется многообещающей, но на самом деле я должен это поставить? в моем классе, где я очищаю все данные или класс конвейера изображения, а также одно, как использовать переменную из моего класса для этого подкласса. Есть ли способ сделать это? любая помощь будет воспринята – user3706469

+0

Мой код - это настраиваемый конвейер, поэтому он переходит в 'pipelines.py'. Из вашего собственного паука вам нужно будет установить 'item ['session_path']' на все, что вы хотите, а затем «выдать элемент» (как обычно). – Aufziehvogel

+0

должен быть какой-то способ установить желаемую папку (динамически) в 'def file_path' – Umair