2016-07-26 6 views
2

После: scrapy's учебник я сделал простой гусеничный образ (царапины изображений Bugattis). Ниже проиллюстрировано значение . Пример.Scrapy: Images Pipeline, download images

Однако, после того, как руководство оставило меня с неработающим гусеничным ходом! Он находит все URL-адреса, но не загружает изображения.

Я нашел решение для утиных лент: замените ITEM_PIPELINES и IMAGES_STORE такими, что;

ITEM_PIPELINES['scrapy.pipeline.images.FilesPipeline'] = 1 и

IMAGES_STORE ->FILES_STORE

Но я не знаю, почему это работает? Я хотел бы использовать ImagePipeline, как описано в обзоре.

ПРИМЕР

settings.py

BOT_NAME = 'imagespider' 
SPIDER_MODULES = ['imagespider.spiders'] 
NEWSPIDER_MODULE = 'imagespider.spiders' 
ITEM_PIPELINES = { 
    'scrapy.pipelines.images.ImagesPipeline': 1, 
} 
IMAGES_STORE = "/home/user/Desktop/imagespider/output" 

items.py

import scrapy 

class ImageItem(scrapy.Item): 
    file_urls = scrapy.Field() 
    files = scrapy.Field() 

imagespider.py

from imagespider.items import ImageItem 
import scrapy 


class ImageSpider(scrapy.Spider): 
    name = "imagespider" 

    start_urls = (
     "https://www.find.com/search=bugatti+veyron", 
    ) 

    def parse(self, response): 
     for elem in response.xpath("//img"): 
      img_url = elem.xpath("@src").extract_first() 
      yield ImageItem(file_urls=[img_url]) 

ответ

5

Элемент, который возвращает ваш паук, содержит поля "file_urls" для файлов и/или "image_urls" для изображений. В вашем коде вы указываете настройки для конвейера изображений, но ваши обратные URL-адреса в "file_urls".

Просто измените эту строку:

yield ImageItem(file_urls=[img_url]) 
# to 
yield {'image_urls': [img_url]} 

* SCRAPY может возвращать объекты словаря вместо элементов, что позволяет экономить время, когда у вас есть только один или два поля.

+1

Спасибо! Вы также можете изменить 'ImageItem', чтобы иметь' image_urls' и 'yield ImageItem (image_urls = [img_url])' –