Использовать ImagesPipeline во вложенных элементах в Scrapy

#python #scrapy

#python #scrapy

Вопрос:

При попытке загрузить изображения в scrapy у меня получаются пустые массивы, и это кажется немного странным. Я выполнил шаги, но, похоже, ImagePipeline не работает с вложенными элементами. Но для меня важно сохранить это изложение в моем выходном файле Json.

Вот мой код:

     import json
import scrapy

from scrapy.loader import ItemLoader
from ccv_spiders.items import AuctionItem

class GlenMarchSpider(scrapy.Spider):
    name = 'auctions_results'

    def __init__(self, *args, **kwargs):
        with open('/home/bolgi/Workspace/Dev/python_workspace/ccv_spiders/ccv_spiders/json/input/db_urls_glenmarch_results_scrapy_reduced.json', encoding='utf-8') as data_file:
            self.data = json.load(data_file)

    def start_requests(self):
        for item in self.data:
            request = scrapy.Request(item['gm_url'], callback=self.parse)
            request.meta['item'] = item
            yield request

    def parse(self, response):
        item = response.meta['item']
        item['results'] = []

        for caritem in response.css("div.car-item-border"):
            data = AuctionItem()
            data["auction_house"] = caritem.css("div.auctionHouse::text").get().split("-", 1)[0].strip()
            data["auction_country"] = caritem.css("div.auctionHouse::text").get().rsplit(",", 1)[1].strip()
            data["auction_date"] = caritem.css("div.date::text").get().replace(",", "").strip()
            data["auction_url"] = caritem.css("div.view-auction a::attr(href)").get()
            data["img_urls"] = caritem.css("img.img-responsive::attr(src)").get()
            item['results'].append(data)

        yield item
  

Файл элемента:

 import scrapy
from scrapy.loader.processors import MapCompose

class AuctionItem(scrapy.Item):
    auction_house= scrapy.Field()
    auction_country= scrapy.Field()
    auction_date= scrapy.Field()
    auction_url= scrapy.Field()
    image_urls= scrapy.Field()

    pass
  

И файл настроек:

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

IMAGES_STORE = 'images'

DOWNLOAD_TIMEOUT = 1200
  

Я не понимаю, как загружать изображения во вложенных элементах с помощью Scrapy…

Комментарии:

1. Вы установили IMAGES_URLS_FIELD = "img_urls" ?

2. Да, и это не работает. После этого я меняю имя элемента на «image_urls», чтобы соответствовать документации. Это не работает.

3. @QBolgi img_urls Поле должно быть в полученном элементе, потому что конвейер обрабатывает только это. Он не обрабатывает вложенные элементы внутри основного элемента. Так что либо поместите это в item dict, либо отдайте data вместо этого.

4. Итак, это будет сложно, потому что я должен использовать вложенный URL, указанный в элементе «результаты».

5. @QBolgi Если вам нужна ваша конкретная структура, то вы можете вместо этого попробовать пользовательский конвейер изображений , где он также ищет URL-адреса изображений в дочерних элементах.