Compare commits

..

2 Commits

Author SHA1 Message Date
Анатолий Богомолов 32c1617f7d store parsing 2023-12-20 12:38:43 +10:00
Анатолий Богомолов 41e42e8b57 fixed logs 2023-12-20 12:38:32 +10:00
4 changed files with 46 additions and 27 deletions

View File

@ -125,21 +125,22 @@ class StolichkiDriver(webdriver.Chrome):
self.add_cookie(new_cookie) self.add_cookie(new_cookie)
def get_network_response(self, url_mask): def get_network_response(self, url_mask):
logs = self.get_log("performance")[self.last_resp_index:] logs = self.get_log("performance")
url_mask = re.compile(url_mask) url_mask = re.compile(url_mask)
body = None
for log in filter(lambda log: self.__filter_logs(log), logs): for log in filter(lambda log: self.__filter_logs(log), logs):
message = json.loads(log.get("message"))['message'] message = json.loads(log.get("message"))['message']
request_id = message["params"]["requestId"] request_id = message["params"]["requestId"]
resp_url = message["params"]["response"]["url"] resp_url = message["params"]["response"]["url"]
if re.fullmatch(url_mask, resp_url) and self.last_resp_url != resp_url: if re.fullmatch(url_mask, resp_url):
self.last_resp_index = logs.index(log) body_ = self.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id})
self.last_resp_url = resp_url body = json.loads(body_['body'])
body = self.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id})
return json.loads(body['body'])
return None return body
def __filter_logs(self, log): def __filter_logs(self, log):
message = json.loads(log.get("message"))['message'] message = json.loads(log.get("message"))['message']

View File

@ -1,11 +1,12 @@
import logging import logging
import dataclasses
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from .browser import StolichkiDriver from .browser import StolichkiDriver
from .types import Store
class Product: class Product:
id: int = 0 id: int = 0
@ -48,11 +49,6 @@ class Product:
def __parse_stores(self): def __parse_stores(self):
try: try:
self.driver.find_element(By.CSS_SELECTOR, "p.badge-class.product-not-found") self.driver.find_element(By.CSS_SELECTOR, "p.badge-class.product-not-found")
return []
except:
pass
try:
self.driver.find_element(By.CSS_SELECTOR, "a.stores-stock.stores-order.package") self.driver.find_element(By.CSS_SELECTOR, "a.stores-stock.stores-order.package")
return [] return []
except: except:
@ -62,20 +58,32 @@ class Product:
wait = WebDriverWait(self.driver, 30) wait = WebDriverWait(self.driver, 30)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "tr-start-store"))) wait.until(EC.presence_of_element_located((By.CLASS_NAME, "tr-start-store")))
reg_stores = r"https://stolichki\.ru/drugs/\d{1,}/stores\?cityId=\d{1,}&no-captcha-token=.{1,}"
response = self.driver.get_network_response(reg_stores)
stores = self.driver.find_elements(By.CLASS_NAME, "tr-start-store") for store in response.get("stores"):
stores_list = [] if store.get("parts"):
for store in stores: prices = store.get("parts")[0]
try:
store_name = store.find_element(By.CLASS_NAME, "store-link").text store_normal = Store(
number_of_product = int(store.find_element(By.CLASS_NAME, "part-quantity").text) id = store.get("id"),
name=store.get("name"),
address=store.get("address"),
price=prices.get("priceStore"),
price_order=prices.get("priceOnline")
)
self.stores.append(store_normal)
stores_list.append({ if bool(prices.get("bad")):
"name": store_name, store_special = dataclasses.replace(store_normal)
"quantity": number_of_product store_special.name += " СП"
}.copy())
except:
continue
return stores_list discounts = prices.get("discounts")
discount = discounts[0].get("value")
store_special.price = store_normal.price - (store_normal.price * (discount / 100))
store_special.price_order = store_normal.price_order - (store_normal.price_order * (discount / 100))
self.stores.append(store_special)

View File

@ -0,0 +1 @@
from .store import *

9
stolichki/types/store.py Normal file
View File

@ -0,0 +1,9 @@
from dataclasses import dataclass
@dataclass
class Store():
id: int
name: str
address: str
price: float = 0.0
price_order: float = 0.0