Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 18, 2023 21:51:11

dolcorp
Зарегистрирован: 2022-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Адрес электронной почты  

Нужна срочная помощь, не могу понять

https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b/uralsk
В городе Уральск цена 299 990, а берется цена города Алматы 239 992

Офлайн

#2 Фев. 19, 2023 00:31:32

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Нужна срочная помощь, не могу понять

  
import requests
from bs4 import BeautifulSoup
headers = {
    'Cookie':"language_id=3; city_id=14;selected_city_id=14"}
url = 'https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b/uralsk'
session = requests.Session()
resp = session.get(url, headers=headers)
html = resp.content.decode()
soup = BeautifulSoup(html, 'html.parser')
search = soup.find('div', class_='product__main-price-wrapper super-price')
search = search and search.find('div', class_='product__price')
out = search and search.text
print(out)

299 990 ₸

Офлайн

#3 Фев. 19, 2023 02:25:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

Нужна срочная помощь, не могу понять

  
>>> import urllib.request
>>> import bs4
>>> 
>>> def get_filtered_price(node):
...     out = {}
...     old_price = node.find(
...         'div', class_='product__price-old')
...     discount_price = node.find(
...         'div', class_='product__price discounted-price')
...     product_price = node.find(
...         'div', class_='product__price')
...     super_price = node.find(
...         'div', class_='product__super')
...     if old_price is not None:
...         if discount_price is not None:
...             dp_sticker = discount_price.find(
...                 'span', attrs={'discounted-price-sticker': ''}).string
...             dp_sticker_clean = clear_sticker_string(dp_sticker)
...             dp_price = discount_price.find_all('span')[1].string
...             dp_price_clean = clear_price_string(dp_price)
...             out = {'type': 'discount',
...                    'level': dp_sticker_clean,
...                    'price': dp_price_clean}
...         else:
...             op_price = old_price.string
...             op_price_clean = clear_price_string(op_price)
...             out = {'type': 'old',
...                    'price': op_price_clean}
...     elif product_price is not None:
...         if super_price is not None:
...             pp_price = product_price.string
...             pp_price_clean = clear_price_string(pp_price)
...             out = {'type': 'discount',
...                    'level': 'percent',
...                    'price': pp_price_clean}
...         else:
...             pp_price = product_price.string
...             pp_price_clean = clear_price_string(pp_price)
...             out = {'type': 'fixed',
...                    'price': pp_price_clean}
...     return out
... 
>>> def clear_price_string(text):
...     out = ''.join(i for i in text if i.isdigit() or i == '.')
...     return out
... 
>>> def clear_sticker_string(text):
...     out = 'low' if text == 'от' else 'undefined'
...     return out
... 
>>> def f(url, city_id):
...     out = {}
...     headers = {
...         'Cookie': 'city_id={0}'.format(city_id)
...     }
...     req = urllib.request.Request(url=url, headers=headers)
...     with urllib.request.urlopen(req) as data:
...         text = data.read().decode('utf-8')
...     doc = bs4.BeautifulSoup(text, 'html.parser')
...     product = doc.find(class_='product__item product__item-js tile-container')
...     out['base_price'] = product['data-price']
...     price = doc.find(class_='product__main-price-wrapper')
...     out['least_price'] = get_filtered_price(price)
...     return out
... 
>>> f('https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b', '1')
{'base_price': '299990.0', 'least_price': {'type': 'discount', 'level': 'low', 'price': '239992'}}
>>> f('https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b', '14')
{'base_price': '299990.0', 'least_price': {'type': 'fixed', 'price': '299990'}}
>>> f('https://www.sulpak.kz/g/noutbuki_acer_nitro_5_an515_57__i5165sgn_nhqeker004', '1')
{'base_price': '439990.0', 'least_price': {'type': 'discount', 'level': 'percent', 'price': '389990'}}
>>> f('https://www.sulpak.kz/g/noutbuki_acer_nitro_5_an515_57__i5165sgn_nhqeker004', '14')
{'base_price': '439990.0', 'least_price': {'type': 'discount', 'level': 'percent', 'price': '389990'}}
>>>



Отредактировано py.user.next (Фев. 19, 2023 02:37:31)

Офлайн

#4 Фев. 19, 2023 06:30:14

dolcorp
Зарегистрирован: 2022-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Адрес электронной почты  

Нужна срочная помощь, не могу понять

Всем доброе утро! Вы можете вставить Ваше решение в мой скрипт, я повторюсь что я не понимаю куда это вставлять и что заменить

Прикреплённый файлы:
attachment parser.rar (2,4 KБ)

Офлайн

#5 Фев. 19, 2023 08:23:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

Нужна срочная помощь, не могу понять

dolcorp
Вы можете вставить Ваше решение в мой скрипт
Закомментировал твои куски и вставил свои.



Прикреплённый файлы:
attachment sulpak_parser_v2_xlsx.py (6,5 KБ)

Офлайн

#6 Фев. 19, 2023 08:30:53

dolcorp
Зарегистрирован: 2022-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Адрес электронной почты  

Нужна срочная помощь, не могу понять

Спасибо огромное, но все равно берется цена что и раньше

Офлайн

#7 Фев. 19, 2023 08:39:16

dolcorp
Зарегистрирован: 2022-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Адрес электронной почты  

Нужна срочная помощь, не могу понять

Может сделать вот такую последовательность приоритета
1<div class=“product__price-old”>
2<div class=“product__price-old-super”>
3<div class=“product__price”>

Офлайн

#8 Фев. 19, 2023 08:50:46

dolcorp
Зарегистрирован: 2022-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Адрес электронной почты  

Нужна срочная помощь, не могу понять

У меня в конце обработки скрипта создается Эксель таблица и в ней снова не та цена

Офлайн

#9 Фев. 19, 2023 10:11:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

Нужна срочная помощь, не могу понять

dolcorp
Спасибо огромное, но все равно берется цена что и раньше
А он скачивает алматинскую страницу просто. Вот у меня в примере видно, что у меня оно как раз всё правильно качает и всё правильно находит. Не всё, конечно, находит, потому что я не углублялся в проценты там во все, но все базовые вещи разделяет на типы и не путает один вид цены с другим.

dolcorp
Может сделать вот такую последовательность приоритета
Не, дело в том, что надо скачивать страницу правильно.

Вот я тут обходной вариант написал.

Твоё закомментировал, своё вставил. Пришлось подменять понятие page из requests, потому что вот этот крендель, который тебе это писал, не знает про уровни зацепления модулей (каплинг), и из-за этого теперь этот requests невозможно вырезать из программы, когда он нафиг не нужен становится. То есть вместо того, чтобы из страницы полученной сделать словарь хотя бы, который не привязан ни к каким модулям с их внутренней структурой, он прямо эту страницу полученную возвращает из функции и все остальные функции снаружи должны знать, что эта страница именно через модуль requests скачана. И всё этим пронизано. Нахера такое делать? Ну, только если ты не знаешь про каплинг.



Отредактировано py.user.next (Фев. 19, 2023 10:26:28)

Прикреплённый файлы:
attachment sulpak_parser_v2_xlsx.py (7,2 KБ)

Офлайн

#10 Фев. 19, 2023 10:25:59

dolcorp
Зарегистрирован: 2022-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Адрес электронной почты  

Нужна срочная помощь, не могу понять

По ссылке цена берется верно, эту ссылку я вставлял специально в фаиле Конфиг чтобы можно было посмотреть на одном товаре. Но теперь вставил туда категорию ноутбуков, ранее парсер сканировал категорию(категории если их несколько) полностью и в эксель добавлялись товары с остатками и ценами, а теперь ошибка вылетает. Приложил фаил с категорией ноутбуков

Прикреплённый файлы:
attachment config.py (1,3 KБ)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version