#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-адреса изображений в дочерних элементах.