Compare commits
2 Commits
c19c91bb81
...
32c1617f7d
Author | SHA1 | Date |
---|---|---|
Анатолий Богомолов | 32c1617f7d | |
Анатолий Богомолов | 41e42e8b57 |
|
@ -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']
|
||||||
|
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
||||||
|
from .store import *
|
|
@ -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
|
Loading…
Reference in New Issue