2016-08-30 4 views
0

У меня есть два вида Предмет:Может ли scrapy давать различные виды предметов?

class MovieItem(scrapy.Item): 
    id = scrapy.Field() 
    image_urls=scrapy.Field() 
    image_paths =scrapy.Field() 
    torrents = scrapy.Field() 
    #...other fields 


class TorrentItem(scrapy.Item): 
    id = scrapy.Field() 
    movie_id = scrapy.Field() 
    image_urls=scrapy.Field() 
    image_paths =scrapy.Field() 

Я хочу использовать ImagePipeline и FilePipeline для загрузки изображений и потоки в кино. Как я должен уступить два элемента в методе *parse*? И как я должен определить соответствующий конвейер?

+0

В scrapy 1.0 вы можете вернуть объекты словаря python. Бесстыдный плагин: вы можете прочитать о различиях между Scrapy 0.24 и 1.0 на моем [блоге] (http://kirankoduru.github.io/python/scrapy-1.0-release.html) –

ответ

1

Ответ да, вы можете. Вот пример того, как это сделать. Вот example.py паук:

# -*- coding: utf-8 -*- 
import scrapy 


class MovieItem(scrapy.Item): 
    id = scrapy.Field() 
    image_urls=scrapy.Field() 
    images =scrapy.Field() 
    torrents = scrapy.Field() 
    itemtype = scrapy.Field() 


class TorrentItem(scrapy.Item): 
    id = scrapy.Field() 
    movie_id = scrapy.Field() 
    image_urls=scrapy.Field() 
    images =scrapy.Field() 


class ExampleSpider(scrapy.Spider): 
    name = "example" 
    allowed_domains = ["example.com"] 
    start_urls = (
     'http://www.example.com/', 
    ) 

    def parse(self, response): 
     image_urls = [ 
      "http://...-Miles.jpg", 
      "https:/.../58832_300x300", 
      "http://...-Circuit-Tests.png" 
     ] 

     torent_ids = [] 
     for i in xrange(3): 
      t = TorrentItem() 
      t["id"] = "#id%d" % i 
      t["movie_id"] = 143 
      t["image_urls"] = [image_urls[i]] 
      # ... 
      torent_ids.append(t["id"]) 
      yield t 

     m = MovieItem() 
     m['id'] = 143 
     m['image_urls'] = ['http://...test.png'] 
     m['torrents'] = torent_ids 
     m['itemtype'] = ['movie'] 
     # ... 
     yield m 

На ваших settings.py добавить следующие две строки:

ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1} 
IMAGES_STORE = '.' 

Запуск паук:

scrapy crawl example -o test.jl 

Ваш файл test.jl будет содержать (после некоторого форматирования) :

{ 
    "images": [ 
     { 
      "url": "http://.../Stuart-Miles.jpg", 
      "path": "full/27c8d5099f8785e8fbc2370249a0260e216ee2dd.jpg", 
      "checksum": "dba2fc121610b328448dc37084f31dac" 
     } 
    ], 
    "movie_id": 143, 
    "id": "#id0", 
    "image_urls": [ 
     "http://...ter-Key-by-Stuart-Miles.jpg" 
    ] 
} 
{ 
    "images": [ 
     { 
      "url": "https://i....t/58832_300x300", 
      "path": "full/b11276eb5b64b5ec7f40eedf4c6fcc6d6d9072ac.jpg", 
      "checksum": "a9b47ecbb2de9dcb6a61a159120f1bd2" 
     } 
    ], 
    "movie_id": 143, 
    "id": "#id1", 
    "image_urls": [ 
     "https://i.vi..._300x300" 
    ] 
} 
{ 
    "images": [ 
     { 
      "url": "http://www.ej...rt-Circuit-Tests.png", 
      "path": "full/a68282eb533d35a0aa8732a872277933db8951c5.jpg", 
      "checksum": "24c0907e3ef610dc355e930f2535c0c4" 
     } 
    ], 
    "movie_id": 143, 
    "id": "#id2", 
    "image_urls": [ 
     "http://www.ejob...nsformer-Open-and-Short-Circuit-Tests.png" 
    ] 
} 
{ 
    "images": [ 
     { 
      "url": "http://...est.png", 
      "path": "full/1e3e0f775cd40aaa5ea081278957f4d49e39f610.jpg", 
      "checksum": "50a57a6263b9640ee47e913deadaff7c" 
     } 
    ] 
    "torrents": [ 
     "#id0", 
     "#id1", 
     "#id2" 
    ], 
    "itemtype": [ 
     "movie" 
    ], 
    "image_urls": [ 
     "http://xi.../10/test.png" 
    ], 
    "id": 143 
} 

Это хорошо работает с .jl файлами в качестве выходных данных. Это не сработает с .csv, но это не должно быть проблемой в вашем случае.

+0

У меня есть три трубопровода: 'InsertDBPipeline', которые вставляют видеоролики в базу данных; 'ImageDownloadPipeline', которые загружают изображения в кино; и «TorrentsDownloadPipeline», которые возвращают экземпляр «TorrentItem» и загружают его. Как вы говорите, я бы дал два типа элементов, но как их можно обрабатывать конвейерами? Другими словами, как заставить 'TorrentsDownloadPipeline' иметь дело с' TorrentItem', в то же время 'InsertDBPipeline' и' ImageDownloadPipeline' работают с 'MovieItem'? –

+0

Вы можете проверить тип объекта на своих конвейерах: http://stackoverflow.com/questions/2225038/determine-the-type-of-an-object – neverlastn