Private-projects / Scrapy_project / fleurop / spiders / flowerspider.py
flowerspider.py
Raw
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