75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
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 |