122 lines
4.2 KiB
Python
122 lines
4.2 KiB
Python
import random
|
|
import json
|
|
|
|
import requests
|
|
from urllib.request import urlretrieve
|
|
|
|
def find_basket(product_id):
|
|
vol = product_id // 100000
|
|
if 0 <= vol <= 143:
|
|
return "01"
|
|
elif 144 <= vol <= 287:
|
|
return "02"
|
|
elif 288 <= vol <= 431:
|
|
return "03"
|
|
elif 432 <= vol <= 719:
|
|
return "04"
|
|
elif 720 <= vol <= 1007:
|
|
return "05"
|
|
elif 1008 <= vol <= 1061:
|
|
return "06"
|
|
elif 1062 <= vol <= 1115:
|
|
return "07"
|
|
elif 1116 <= vol <= 1169:
|
|
return "08"
|
|
elif 1170 <= vol <= 1313:
|
|
return "09"
|
|
elif 1314 <= vol <= 1601:
|
|
return "10"
|
|
elif 1602 <= vol <= 1655:
|
|
return "11"
|
|
elif 1656 <= vol <= 1919:
|
|
return "12"
|
|
elif 1920 <= vol <= 2045:
|
|
return "13"
|
|
else:
|
|
return "14"
|
|
|
|
def get_description(product_id, basket_number):
|
|
response = "https://basket-"+str(basket_number)+".wbbasket.ru/vol"+\
|
|
str(product_id)[:4]+"/part"+str(product_id)[:6]+"/"+str(product_id)+"/info/ru/card.json"
|
|
req = requests.get(response)
|
|
|
|
if req.status_code != 200:
|
|
return None
|
|
|
|
req_data = json.loads(req.text)
|
|
if "description" in req_data.keys():
|
|
description = req_data["description"]
|
|
return description
|
|
else:
|
|
return None
|
|
|
|
def get_product_list():
|
|
get_resp = "https://recom.wb.ru/personal/ru/common/v5/search?ab_testing=false&appType=1&curr=rub&dest=-5551775&page="+\
|
|
str(random.randint(2, 10))+\
|
|
"&query=0&resultset=catalog&spp=30&suppressSpellcheck=false&uclusters=1&uiv=2&uv=pYuil6rQLkSmf64EMTQuYCWBqvykpiEYpNOsPS8YqYqkrq8hrf6ovav9sdyIIappJ-CxiyIFpzwujavmK8exDqmFqK8xni6WLloz_K7Irlue06ywIW4soaupsrQtNauCrNWqCy9NsPKs3Z1EmyEp9S3OpWsvNyStrl2uYh-DKNcshC6kL9ktNK-bsQcp6RhCrrevCSbksNspSK5pqTUiDy3BpFGkzSSbrFguwK5MrESiszFepsCosyTeFyUoV6xbLO4piKZEnm6pPK6LLyAcKTKqrl8weS2TpwCfGy1lrZUqQDCArLOrmy-UMFqtoS_nLvYgciDVI1qsMKEuMcYfKw"
|
|
req = json.loads(requests.get(get_resp).text)
|
|
|
|
return req["data"]["products"]
|
|
|
|
def get_img(product_id, basket_counter, pics_number):
|
|
pics_names_list = list()
|
|
for pic_index in range(1, pics_number):
|
|
name = f"{product_id}_{pic_index}.png"
|
|
|
|
true_path = None
|
|
for first in [3, 4]:
|
|
for second in [5, 6]:
|
|
req = requests.get("https://basket-" + str(basket_counter) + ".wbbasket.ru/vol" + str(product_id)[
|
|
:first] + "/part" + str(product_id)[:second] + "/" + str(product_id) + "/images/big/"+str(pic_index)+".webp")
|
|
if req.status_code == 200:
|
|
true_path = [first, second]
|
|
if true_path:
|
|
get_resp = "https://basket-" + str(basket_counter) + ".wbbasket.ru/vol" + str(product_id)[
|
|
:true_path[0]] + "/part" + str(product_id)[:true_path[1]] + "/" + str(product_id) + "/images/big/"+str(pic_index)+".webp"
|
|
urlretrieve(get_resp, f"img/{name}")
|
|
pics_names_list.append(name)
|
|
return pics_names_list
|
|
|
|
def get_product_info(product):
|
|
product_id = product["id"]
|
|
basket_number = find_basket(product_id)
|
|
|
|
name = product["name"]
|
|
description = get_description(product_id, basket_number)
|
|
brand = product["brand"]
|
|
rating = product["reviewRating"]
|
|
feedbacks = product["feedbacks"]
|
|
price = product["sizes"][0]["price"]["product"]
|
|
pics_number = product["pics"]
|
|
|
|
return product_id, name, description, brand, rating, feedbacks, price, pics_number, basket_number
|
|
|
|
if __name__ == "__main__":
|
|
prod_list = get_product_list()
|
|
|
|
products_in_list = list()
|
|
for product in prod_list:
|
|
product_id, name, description, brand, rating, feedbacks, price, pics_number, basket_number = get_product_info(product)
|
|
|
|
pics_names_list = get_img(product_id, basket_number, pics_number)
|
|
|
|
result = {product_id: {"name": name,
|
|
"description": description,
|
|
"brand": brand,
|
|
"rating": rating,
|
|
"feedbacks": feedbacks,
|
|
"price": price,
|
|
"pics_files": pics_names_list}
|
|
|
|
}
|
|
products_in_list.append(result)
|
|
|
|
print(len(products_in_list), *products_in_list[:3], sep="\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|