예제 #1
0
    def products_for_url(cls, url, category=None, extra_args=None):
        session = session_with_proxy(extra_args)
        session.headers['Accept-Encoding'] = 'deflate'
        response = session.get(url)

        if response.status_code == 500:
            return []

        soup = BeautifulSoup(response.text,
                             'html.parser')

        name = soup.find('title').text.strip()
        sku = soup.find('input', {'name': 'product_id'})['value']

        description = html_to_markdown(
            str(soup.find('div', {'id': 'tab-description'})))
        pictures_container = soup.find('ul', 'thumbnails')

        if pictures_container:
            picture_urls = [tag['href'] for tag in pictures_container.findAll(
                'a', 'thumbnail') if tag['href']]
        else:
            picture_urls = None

        if soup.find('button', {'id': 'button-cart'}):
            stock = -1
        else:
            stock = 0

        price_text = soup.findAll('h2')[-1].text.replace('.', '')

        normal_price = re.search(r'Webpay: \$(\d+)', price_text)
        normal_price = Decimal(normal_price.groups()[0])

        offer_price = re.search(r'Transferencia: \$(\d+)', price_text)
        offer_price = Decimal(offer_price.groups()[0])

        p = Product(
            name,
            cls.__name__,
            category,
            url,
            url,
            sku,
            stock,
            normal_price,
            offer_price,
            'CLP',
            sku=sku,
            part_number=sku,
            description=description,
            picture_urls=picture_urls
        )

        return [p]
예제 #2
0
    def products_for_url(cls, url, category=None, extra_args=None):
        session = session_with_proxy(extra_args)
        response = session.get(url)

        if response.url != url:
            return []

        page_source = response.text

        pricing_data = re.search(r'vtex.events.addData\(([\S\s]+?)\);',
                                 page_source).groups()[0]
        pricing_data = json.loads(pricing_data)

        skus_data = re.search(r'var skuJson_0 = ([\S\s]+?);',
                              page_source).groups()[0]
        skus_data = json.loads(skus_data)
        name = '{} {}'.format(pricing_data['productBrandName'],
                              pricing_data['productName'])
        normal_price = Decimal(pricing_data['productPriceTo'])

        soup = BeautifulSoup(page_source, 'html.parser')

        discount_container = soup.find('div', 'price_box-v1').fetchParents()[0]
        discount_container = discount_container.findAll('p', 'flag')
        if discount_container:
            discount_container = discount_container[-1]
            discount_value = re.search(r'(\d+)', discount_container.text)
            discount_value = Decimal(discount_value.groups()[0])
            discount_factor = (Decimal(100) - discount_value) / Decimal(100)

            offer_price = normal_price * discount_factor
            offer_price = offer_price.quantize(Decimal('0.01'))
        else:
            offer_price = normal_price

        picture_urls = [
            tag['rel'][0].split('?')[0]
            for tag in soup.findAll('a', {'id': 'botaoZoom'})
        ]

        description = ''
        panel_classes = ['blc_1', 'blc_2']

        for panel_class in panel_classes:
            panel = soup.find('div', panel_class)
            description += html_to_markdown(str(panel)) + '\n\n'

        products = []

        if 'productEans' in pricing_data:
            ean = pricing_data['productEans'][0]
            if len(ean) == 12:
                ean = '0' + ean
            if not check_ean13(ean):
                ean = None
        else:
            ean = None

        for sku_data in skus_data['skus']:
            sku = str(sku_data['sku'])
            stock = pricing_data['skuStocks'][sku]

            p = Product(name,
                        cls.__name__,
                        category,
                        url,
                        url,
                        sku,
                        stock,
                        normal_price,
                        offer_price,
                        'BRL',
                        sku=sku,
                        ean=ean,
                        description=description,
                        picture_urls=picture_urls)
            products.append(p)

        return products