import scrapy
from fleurop.items import FlowerItem
class FlowerSpider(scrapy.Spider):
name = "flowerspider"
allowed_domains = ["www.fleurop.de"]
start_urls = ["https://www.fleurop.de/alle-blumenstraeusse?p=1"]
custom_settings = {
'FEEDS': { 'flowers_%(time)s.csv': { 'format': 'csv', 'overwrite': True}}
}
def parse(self, response):
bouquets = response.css('div[class*="cms-listing-col"]')
for bouquet in bouquets:
if bouquet.css("div a").attrib["title"]:
bouquet_url = bouquet.css("div a").attrib["href"]
yield scrapy.Request(bouquet_url, callback=self.parse_bouquet_page)
n_pages = response.css("div.has-element-loader.load-more-products").attrib[
"data-total-pages"
]
for page in range(int(n_pages), 1, -1): # int(n_pages), 1, -1
next_page_url = f"https://www.fleurop.de/alle-blumenstraeusse?p={page}"
yield response.follow(next_page_url, callback=self.parse)
def parse_bouquet_page(self, response):
flower_item = FlowerItem()
flower_item['url'] = response.url
flower_item['name'] = response.css('div.product-heading h1::text').get()
flower_item['delivery_period'] = response.css('div.deliveryPeriod::text').get()
if response.css('div.option-label::text').get():
flower_item['product_options'] = dict(zip(
[el.strip() for el in response.css('div.option-label::text').getall()],
[el.strip().replace('\xa0€', ' €') for el in response.css('div.option-price::text').getall()]
))
else:
flower_item['product_options'] = response.css('p.product-detail-price::text').get().strip().replace('\xa0€', ' €')
flower_item['product_description'] = response.css('div.card-body.description-content').get()
flower_item['content'] = [el.strip() for el in response.css('div.blossom-name::text').getall()]
flower_item['colors'] = [el.strip() for el in response.css('div.color-name::text').getall()]
flower_item['delivery_info'] = response.css('div.card-body.pdp-delivery-content').get()
flower_item['image_urls'] = response.css('div.gallery-slider-thumbnails-item-inner img::attr(src)').getall()
if flower_item['image_urls'] == []:
flower_item['image_urls'] = response.css('div.gallery-slider-single-image img::attr(src)').get()
yield flower_item