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]
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