import json from dataclasses import dataclass from typing import Optional import aiohttp from bs4 import BeautifulSoup from surugaya_api.consts import SURU_COOKIE_STRING @dataclass class ProductStock: condition: str stock: str price: int on_sale_price: Optional[int] @property def is_on_sale(self) -> bool: return self.on_sale_price is not None @staticmethod def from_item_price(item_price): data: dict = json.loads(item_price.select_one("input").attrs["data-zaiko"]) return ProductStock( condition=item_price.select_one("label").attrs["data-label"].strip(), stock=data["zaiko"], price=data["baika"], on_sale_price=data.get("price_sale") ) @dataclass class Product: id: int name: str main_image_href: str stock: [ProductStock] @property def in_stock(self): return not self.stock async def load_product(product_id, aiohttp_session=None): if not aiohttp_session: _aiohttp_session = aiohttp.ClientSession() else: _aiohttp_session = aiohttp_session async with _aiohttp_session.get( url="https://www.suruga-ya.jp/product/detail/" + str(product_id), headers={ "Cookie": SURU_COOKIE_STRING, }, ) as response: page = await response.text() page_bs = BeautifulSoup( page, features="html.parser" ) product = Product( id=int(product_id), name=page_bs.select_one("#item_title").text.strip(), main_image_href=page_bs.select_one(".main-pro-img").attrs["src"], stock=[ ProductStock.from_item_price(item_price) for item_price in page_bs.select(".item-price") ] ) if not aiohttp_session: await _aiohttp_session.close() return product