modified: amazon/__pycache__/approve.cpython-39.pyc
modified: amazon/__pycache__/asin_status.cpython-39.pyc new file: amazon/__pycache__/detail_spider.cpython-39.pyc modified: amazon/__pycache__/main.cpython-39.pyc modified: amazon/__pycache__/match_action.cpython-39.pyc modified: amazon/__pycache__/price_match.cpython-39.pyc modified: amazon/approve.py modified: amazon/asin_status.py new file: amazon/detail_spider.py modified: amazon/main.py modified: amazon/match_action.py modified: amazon/price_match.py modified: assets/convert.js modified: assets/dedupe.js modified: assets/delete-brand.js modified: assets/split.js modified: new_web_source/convert.html modified: new_web_source/dedupe.html modified: new_web_source/delete-brand.html modified: new_web_source/split.html modified: web_source/brand.html
This commit is contained in:
Binary file not shown.
Binary file not shown.
BIN
app/amazon/__pycache__/detail_spider.cpython-39.pyc
Normal file
BIN
app/amazon/__pycache__/detail_spider.cpython-39.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -483,8 +483,8 @@ class AmzoneApprove(AmamzonBase):
|
||||
load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5)
|
||||
if len(load_ele) > 0:
|
||||
load_ele[0].wait.deleted(timeout=3, raise_err=False)
|
||||
time.sleep(0.5)
|
||||
|
||||
time.sleep(0.5)
|
||||
# 获取当前页码
|
||||
try:
|
||||
page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5)
|
||||
@@ -1065,6 +1065,8 @@ class ApproveTask:
|
||||
# 更新已处理国家数
|
||||
if task_id in runing_task:
|
||||
runing_task[task_id]["processed_countries"] += 1
|
||||
|
||||
self.log(f"{task_id}任务处理完成")
|
||||
# 最后回传,标记完成
|
||||
try:
|
||||
self.post_result(task_id, shop_name, country_code, "", "", is_done=True)
|
||||
|
||||
@@ -432,6 +432,8 @@ class StatusTask:
|
||||
# 关闭店铺
|
||||
driver.close_store()
|
||||
|
||||
self.log(f"{task_id}任务处理完成")
|
||||
|
||||
# 最后回传,标记完成
|
||||
try:
|
||||
# self.post_result(task_id, shop_name, country_code, "", "", is_done=True)
|
||||
|
||||
6907
app/amazon/detail_spider.py
Normal file
6907
app/amazon/detail_spider.py
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,7 @@ from amazon.approve import ApproveTask
|
||||
from amazon.match_action import MatchTak
|
||||
from amazon.price_match import PriceTask
|
||||
from amazon.asin_status import StatusTask
|
||||
from amazon.detail_spider import SpiderTask
|
||||
|
||||
|
||||
from amazon.tool import get_shop_info,show_notification
|
||||
@@ -57,7 +58,8 @@ class TaskMonitor:
|
||||
"product-risk-resolve-run" : "产品风险审批",
|
||||
"shop-match-run" : "匹配价格",
|
||||
"price-track-run" : "跟价",
|
||||
"query-asin-run" : "状态查询"
|
||||
"query-asin-run" : "状态查询",
|
||||
"appearance-patent-run" : "亚马逊采集",
|
||||
}
|
||||
try:
|
||||
while self.running:
|
||||
@@ -125,7 +127,8 @@ class TaskMonitor:
|
||||
"产品风险审批" : ApproveTask,
|
||||
"匹配价格" : MatchTak,
|
||||
"跟价" : PriceTask,
|
||||
"状态查询" : StatusTask
|
||||
"状态查询" : StatusTask,
|
||||
"亚马逊采集" : SpiderTask,
|
||||
}
|
||||
self.log(f"线程 {id(task_data)} 开始处理产品风险审批任务...")
|
||||
# 创建ApproveTask实例并处理任务
|
||||
|
||||
@@ -451,7 +451,7 @@ class MatchTak:
|
||||
# 更新已处理国家数
|
||||
if task_id in runing_task:
|
||||
runing_task[task_id]["processed_countries"] += 1
|
||||
|
||||
self.log(f"{task_id}任务处理完成")
|
||||
# 最后回传,标记完成
|
||||
try:
|
||||
# self.post_result(task_id, shop_name, country_code, "", "", is_done=True)
|
||||
|
||||
@@ -17,6 +17,97 @@ from amazon.tool import show_notification,get_shop_info,remove_special_character
|
||||
from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE
|
||||
|
||||
|
||||
class RepricingLogic:
|
||||
|
||||
@staticmethod
|
||||
def situation_1_general_decrease(my_price, rank1_price, is_first_time=False):
|
||||
"""
|
||||
情况1:常规递减跟价 (最左侧独立长图块)
|
||||
当不是自己购物车时,按总价当作第一名递减。
|
||||
"""
|
||||
if is_first_time:
|
||||
return rank1_price - 0.3
|
||||
|
||||
diff = abs(my_price - rank1_price)
|
||||
|
||||
# 精简了原图中长串的阶梯逻辑
|
||||
if diff <= 0.3:
|
||||
return rank1_price - 0.5
|
||||
elif diff <= 0.8:
|
||||
return rank1_price - 0.7
|
||||
elif diff <= 10.5:
|
||||
# 0.8 到 10.5 之间,原图逻辑全部是“减1”
|
||||
return rank1_price - 1.0
|
||||
else:
|
||||
return None # 相差10.5以上,跳过
|
||||
|
||||
@staticmethod
|
||||
def situation_2_own_buybox(my_price, rank2_price):
|
||||
"""
|
||||
情况2:已经是自己购物车
|
||||
逻辑:判断与第二名的差价,如果拉开足够差距,则稍微降一点点(减0.5)保持优势,防止卖太便宜。
|
||||
"""
|
||||
diff = abs(rank2_price - my_price)
|
||||
|
||||
# 1. 绝对差价2欧以上
|
||||
if diff >= 2.0:
|
||||
return rank2_price - 0.3
|
||||
|
||||
# 2. 产品售价区间判定 (是否要提高价格)
|
||||
if (20 <= my_price < 30 and diff >= 4) or \
|
||||
(30 <= my_price < 60 and diff >= 8) or \
|
||||
(60 <= my_price <= 150 and diff >= 15):
|
||||
return rank2_price - 0.3 # 满足区间大差价,提价至第二名之下
|
||||
|
||||
return my_price # 不满足条件则保持原价
|
||||
|
||||
@staticmethod
|
||||
def situation_3_not_own_buybox(my_price, rank1_price):
|
||||
"""
|
||||
情况3:不是自己购物车 (常规情况)
|
||||
"""
|
||||
diff = abs(my_price - rank1_price)
|
||||
|
||||
if diff <= 0.3:
|
||||
return rank1_price - 0.5
|
||||
elif 0.5 <= diff <= 0.8:
|
||||
return rank1_price - 0.7
|
||||
elif 0.8 < diff <= 2.5:
|
||||
return rank1_price - 1.0
|
||||
elif diff > 2.5: # 2.5-3.5以上跳过
|
||||
return None
|
||||
|
||||
return rank1_price - 0.3 # 默认按第一名减0.3
|
||||
|
||||
@staticmethod
|
||||
def situation_4_encounter_amz_us_1st(my_price, amz_us_price):
|
||||
"""
|
||||
情况4:第一名是 Amazon US 卖家
|
||||
"""
|
||||
diff = abs(my_price - amz_us_price)
|
||||
|
||||
if diff <= 3:
|
||||
return amz_us_price - 2
|
||||
elif 4 <= diff <= 6:
|
||||
return amz_us_price - 3
|
||||
elif 8 <= diff <= 12:
|
||||
return None # 跳过不跟价
|
||||
|
||||
return amz_us_price - 3 # 默认直接按照 Amazon US 减去3
|
||||
|
||||
@staticmethod
|
||||
def situation_5_im_1st_amz_us_2nd(my_price, amz_us_price):
|
||||
"""
|
||||
情况5:自己是第一名,第二名是 Amazon US 卖家
|
||||
"""
|
||||
diff = abs(amz_us_price - my_price)
|
||||
|
||||
if diff <= 7:
|
||||
return None # 相差5以内跳过 (保持原价)
|
||||
else:
|
||||
return amz_us_price - 5
|
||||
|
||||
|
||||
def calculate_target_price(
|
||||
front_end_data,current_Price,current_shop_name,
|
||||
recommended_price,recommended_shipping
|
||||
@@ -35,65 +126,44 @@ def calculate_target_price(
|
||||
|
||||
# --- Step 2: 紫鸟后台特殊判定 (最高优先级) ---
|
||||
if recommended_shipping > 0:
|
||||
backend_base_price = recommended_price
|
||||
backend_shipping = recommended_shipping
|
||||
total_price = backend_base_price + backend_shipping
|
||||
|
||||
if is_my_buybox:
|
||||
# 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整
|
||||
return None
|
||||
else:
|
||||
# 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑
|
||||
return calculate_standard_competitor_pricing(my_price, total_price)
|
||||
price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格
|
||||
return RepricingLogic.situation_1_general_decrease(my_price,price_1,is_my_buybox)
|
||||
# backend_base_price = recommended_price
|
||||
# backend_shipping = recommended_shipping
|
||||
# total_price = backend_base_price + backend_shipping
|
||||
#
|
||||
# if is_my_buybox:
|
||||
# # 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整
|
||||
# return None
|
||||
# else:
|
||||
# # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑
|
||||
# return calculate_standard_competitor_pricing(my_price, total_price)
|
||||
|
||||
# # 第一名是自己, 第二名 Amazon US 卖家 的情况
|
||||
shop_name_1 = front_end_data.get("top_sellers")[0].get("shop_name")
|
||||
shop_name_2 = front_end_data.get("top_sellers")[1].get("shop_name") if len(front_end_data.get("top_sellers")) >=2 else ""
|
||||
if shop_name_1 == current_shop_name and "Amazon" in shop_name_2:
|
||||
price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格
|
||||
diff = abs(my_price - price_2)
|
||||
if diff < 5:
|
||||
return price_2 -3
|
||||
elif 5.0 < diff <= 8.0:
|
||||
return price_2 -3
|
||||
return RepricingLogic.situation_5_im_1st_amz_us_2nd(my_price,price_2)
|
||||
|
||||
# --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) ---
|
||||
|
||||
# 分支 A:第一名是 Amazon US 卖家 (特殊强敌优先)
|
||||
price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格
|
||||
if "Amazon." in cart_seller:
|
||||
diff = abs(my_price - price_1)
|
||||
if diff <= 5.0 :
|
||||
return None
|
||||
elif 5.0 < diff <= 8.0:
|
||||
return price_1 - 3.0
|
||||
elif diff > 8.0:
|
||||
return price_1 - 6 # 跳过,不跟价
|
||||
|
||||
if "Amazon" in shop_name_1:
|
||||
return RepricingLogic.isituation_4_encounter_amz_us_1st(my_price,price_1)
|
||||
|
||||
|
||||
# 分支 B:不是 Amazon US,且目前是自己的购物车
|
||||
elif is_my_buybox:
|
||||
price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格
|
||||
|
||||
diff_with_2nd = price_2 - my_price
|
||||
if diff_with_2nd >= 2.0:
|
||||
return price_2 - 0.3
|
||||
else:
|
||||
# 提价区间判定
|
||||
if (20 <= my_price <= 30) and diff_with_2nd >= 4:
|
||||
return price_2 - 0.3
|
||||
elif (30 <= my_price <= 60) and diff_with_2nd >= 8:
|
||||
return price_2 - 0.3
|
||||
elif (60 <= my_price <= 150) and diff_with_2nd >= 15:
|
||||
return price_2 - 0.3
|
||||
else:
|
||||
return None
|
||||
return RepricingLogic.situation_2_own_buybox(my_price,price_2)
|
||||
|
||||
# 分支 C:不是 Amazon US,也不是自己的购物车
|
||||
else:
|
||||
# 正常情况下的普通跟价,调用阶梯逻辑
|
||||
return calculate_standard_competitor_pricing(my_price, price_1)
|
||||
return RepricingLogic.situation_3_not_own_buybox(my_price, price_1)
|
||||
|
||||
|
||||
# =====================================================================
|
||||
@@ -107,7 +177,7 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr
|
||||
diff = abs(my_current_price - target_competitor_price)
|
||||
|
||||
# 根据阶梯执行跟价扣减
|
||||
if diff <= 0.3:
|
||||
if 0 < diff < 0.5:
|
||||
return base_target - 0.5
|
||||
elif 0.5 <= diff <= 0.8:
|
||||
return base_target - 0.7
|
||||
@@ -117,12 +187,13 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr
|
||||
return base_target - 1.0
|
||||
elif 2.5 < diff <= 3 :
|
||||
return None # 差距过大,跳过不跟价
|
||||
elif diff > 3:
|
||||
# elif diff > 3:
|
||||
# return base_target
|
||||
else:
|
||||
return base_target
|
||||
|
||||
|
||||
|
||||
|
||||
class ChromeAmzone:
|
||||
mark_name = "亚马逊详情采集"
|
||||
|
||||
@@ -531,8 +602,8 @@ class AmzonePriceMatch(AmamzonBase):
|
||||
current_country_ele = self.tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]',
|
||||
timeout=20)
|
||||
current_country = current_country_ele.text.strip()
|
||||
|
||||
while retry_num < 3: # 最多重试3次
|
||||
max_retry_num = 5
|
||||
while retry_num < max_retry_num: # 最多重试3次
|
||||
try:
|
||||
if appoint_asin is not None:
|
||||
print(self.mark_name,"指定asin操作",appoint_asin)
|
||||
@@ -548,7 +619,7 @@ class AmzonePriceMatch(AmamzonBase):
|
||||
page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5)
|
||||
if len(page_pamel) > 0:
|
||||
current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text
|
||||
|
||||
# yield (None,{"page":int(current_page.strip())})
|
||||
# 总页数
|
||||
total_page = page_pamel[0].sr.eles(
|
||||
'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]')
|
||||
@@ -567,6 +638,14 @@ class AmzonePriceMatch(AmamzonBase):
|
||||
|
||||
sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10)
|
||||
print(f"【{self.mark_name}】获取到 {len(sku_ls)}")
|
||||
|
||||
if len(sku_ls) == 0:
|
||||
retry_num += 1
|
||||
print(f"没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}")
|
||||
self.tab.refresh()
|
||||
self.tab.wait.doc_loaded(raise_err=False, timeout=120)
|
||||
continue
|
||||
|
||||
# for sku_ele in sku_ls[0:2]:
|
||||
for sku_ele in sku_ls:
|
||||
|
||||
@@ -636,6 +715,7 @@ class AmzonePriceMatch(AmamzonBase):
|
||||
chrome = ChromeAmzone(tab=new_tab)
|
||||
front_end_data = chrome.run(country=current_country)
|
||||
chrome.close()
|
||||
self.clear_tab()
|
||||
print(self.mark_name,"亚马逊前台抓取到数据",front_end_data)
|
||||
if front_end_data is None or len(front_end_data.get("top_sellers")) == 0:
|
||||
yield (asin, {
|
||||
@@ -698,8 +778,28 @@ class AmzonePriceMatch(AmamzonBase):
|
||||
"firstPlace": price_1,
|
||||
"secondPlace": price_2,
|
||||
"cartShopName" : cartShopName,
|
||||
"shippingFee" : f"{shipping_fee}",
|
||||
"priceChangeStatus" : "改价成功",
|
||||
})
|
||||
else:
|
||||
recommendedPrice = recommend_price + shipping_fee
|
||||
price_1 = float(front_end_data.get("top_sellers")[0].get("price")) if len(
|
||||
front_end_data.get("top_sellers")) >= 2 else "" # 实际第一名价格
|
||||
price_2 = float(front_end_data.get("top_sellers")[1].get("price")) if len(
|
||||
front_end_data.get("top_sellers")) >= 2 else "" # 实际第二名价格
|
||||
cartShopName = front_end_data.get("cart_seller")
|
||||
yield (asin, {
|
||||
"statu": "跳过,无需改价",
|
||||
"currentPrice": current_price,
|
||||
"recommendedPrice": f"{recommendedPrice}",
|
||||
"minimumPrice": bottom_price, # 最低价格
|
||||
"firstPlace": price_1,
|
||||
"secondPlace": price_2,
|
||||
"cartShopName": cartShopName,
|
||||
"shippingFee": f"{shipping_fee}",
|
||||
"priceChangeStatus": "跳过,无需改价",
|
||||
})
|
||||
|
||||
already_asin.add(asin)
|
||||
|
||||
# 判断是否存在需要翻页的情况
|
||||
@@ -714,6 +814,7 @@ class AmzonePriceMatch(AmamzonBase):
|
||||
num += 1
|
||||
print(f"【{self.mark_name}】【程序计算】正在翻页,已翻 {num} 页...")
|
||||
already_asin = set()
|
||||
retry_num = 0
|
||||
|
||||
except Exception as e:
|
||||
print(f"【{self.mark_name}】处理跟价操作异常", e)
|
||||
@@ -937,7 +1038,7 @@ class PriceTask:
|
||||
minimum_price_by_country_and_asin = shop_item.get("minimum_price_by_country_and_asin",{})
|
||||
if len(minimum_price_by_country_and_asin) > 0:
|
||||
country_codes = minimum_price_by_country_and_asin.keys()
|
||||
|
||||
|
||||
# 指定ASIN的情况
|
||||
mode = shop_item.get("mode")
|
||||
|
||||
@@ -1006,6 +1107,7 @@ class PriceTask:
|
||||
self.post_stage_finished(task_id, user_id, stage_index)
|
||||
except Exception as e:
|
||||
self.log(f"回传结果失败: {str(e)}", "ERROR")
|
||||
self.log(f"{task_id}任务处理完成")
|
||||
|
||||
# 从正在执行中的店铺列表中移除
|
||||
if shop_name in runing_shop:
|
||||
@@ -1136,32 +1238,35 @@ class PriceTask:
|
||||
else:
|
||||
_shopMallName = shopMallName
|
||||
ap_asin = None
|
||||
for _ in range(max_retries):
|
||||
for asin, status in driver.run_page_action(
|
||||
current_shop_name=_shopMallName,
|
||||
appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode,
|
||||
miniprice_info=miniprice_info
|
||||
):
|
||||
if asin is None:
|
||||
continue
|
||||
# 检查是否收到暂停请求
|
||||
if task_id in runing_task and runing_task[task_id].get("stop_requested", False):
|
||||
self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING")
|
||||
break
|
||||
|
||||
for asin, status in driver.run_page_action(
|
||||
current_shop_name=_shopMallName,
|
||||
appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode,
|
||||
miniprice_info=miniprice_info
|
||||
):
|
||||
# 检查是否收到暂停请求
|
||||
if task_id in runing_task and runing_task[task_id].get("stop_requested", False):
|
||||
self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING")
|
||||
break
|
||||
self.log(f"ASIN {asin} 处理结果: {status}")
|
||||
|
||||
self.log(f"ASIN {asin} 处理结果: {status}")
|
||||
# 更新任务状态
|
||||
if task_id in runing_task:
|
||||
runing_task[task_id]["current_asin"] = asin
|
||||
runing_task[task_id]["processed_asins"] += 1
|
||||
|
||||
# 更新任务状态
|
||||
if task_id in runing_task:
|
||||
runing_task[task_id]["current_asin"] = asin
|
||||
runing_task[task_id]["processed_asins"] += 1
|
||||
runing_task[task_id]["failed_count"] += 1
|
||||
|
||||
runing_task[task_id]["failed_count"] += 1
|
||||
|
||||
# 回传结果到API
|
||||
try:
|
||||
self.post_result(task_id, shop_name, country_code, asin, status,shopMallName)
|
||||
except Exception as e:
|
||||
self.log(f"回传结果失败: {str(e)}", "ERROR")
|
||||
# 回传结果到API
|
||||
try:
|
||||
self.post_result(task_id, shop_name, country_code, asin, status,shopMallName)
|
||||
except Exception as e:
|
||||
self.log(f"回传结果失败: {str(e)}", "ERROR")
|
||||
|
||||
break
|
||||
|
||||
self.log(f"国家 {country_name} 处理完成")
|
||||
|
||||
@@ -1216,18 +1321,6 @@ class PriceTask:
|
||||
"""
|
||||
|
||||
url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result"
|
||||
"""
|
||||
(asin,{
|
||||
"statu" : "改价成功",
|
||||
"currentPrice" : current_price,
|
||||
"recommendedPrice" : f"{recommendedPrice}",
|
||||
"minimumPrice" : bottom_price, #最低价格
|
||||
"firstPlace": price_1,
|
||||
"secondPlace": price_2,
|
||||
"cartShopName" : current_shop_name,
|
||||
"priceChangeStatus" : "改价成功",
|
||||
})
|
||||
"""
|
||||
|
||||
payload = {
|
||||
"shops": [
|
||||
@@ -1248,6 +1341,7 @@ class PriceTask:
|
||||
"deleteSkipAsin": status.get("deleteSkipAsin",False),
|
||||
"removeAsin": status.get("removeAsin") if status.get("removeAsin") else "",
|
||||
# "modifyCount": "2",
|
||||
"shippingFee" : status.get("shippingFee") if status.get("shippingFee") else "",
|
||||
"status": status.get("statu")
|
||||
}
|
||||
]
|
||||
@@ -1296,34 +1390,44 @@ class PriceTask:
|
||||
|
||||
if __name__ == '__main__':
|
||||
# 使用示例
|
||||
user_info = {
|
||||
"company": "尾号5578的公司115",
|
||||
"username": "自动化_Robot",
|
||||
"password": "#20zsg25"
|
||||
}
|
||||
shop_name = "林建华"
|
||||
country = "德国"
|
||||
kill_process('v6')
|
||||
driver = AmzonePriceMatch(user_info)
|
||||
browser = driver.open_shop(shop_name)
|
||||
sw_suc = driver.SwitchingCountries(country)
|
||||
driver.SwitchPage()
|
||||
risk_listing_filter = "Active"
|
||||
_shopMallName = "WEIZHENFENG168"
|
||||
ap_asin ="B0FHGQY18W"
|
||||
skip_asin = []
|
||||
for _ in range(3):
|
||||
try:
|
||||
sku_ls = driver.search(filter_type=risk_listing_filter)
|
||||
break
|
||||
except Exception as e:
|
||||
print(e)
|
||||
driver.tab.refresh()
|
||||
if len(sku_ls) > 0:
|
||||
print("有数据,开始操作")
|
||||
for asin, status in driver.run_page_action(
|
||||
current_shop_name=_shopMallName,
|
||||
appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin"
|
||||
):
|
||||
print(f"ASIN {asin} 的处理结果: {status}")
|
||||
print("已完成操作")
|
||||
# user_info = {
|
||||
# "company": "尾号5578的公司115",
|
||||
# "username": "自动化_Robot",
|
||||
# "password": "#20zsg25"
|
||||
# }
|
||||
# shop_name = "刘建煌"
|
||||
# country = "德国"
|
||||
# kill_process('v6')
|
||||
# driver = AmzonePriceMatch(user_info)
|
||||
# browser = driver.open_shop(shop_name)
|
||||
# sw_suc = driver.SwitchingCountries(country)
|
||||
# driver.SwitchPage()
|
||||
# risk_listing_filter = "Active"
|
||||
# _shopMallName = "Jianhuang 888"
|
||||
# ap_asin ="B0BGHRP6BS"
|
||||
# skip_asin = []
|
||||
# for _ in range(3):
|
||||
# try:
|
||||
# sku_ls = driver.search(filter_type=risk_listing_filter)
|
||||
# break
|
||||
# except Exception as e:
|
||||
# print(e)
|
||||
# driver.tab.refresh()
|
||||
# if len(sku_ls) > 0:
|
||||
# print("有数据,开始操作")
|
||||
# for asin, status in driver.run_page_action(
|
||||
# current_shop_name=_shopMallName,
|
||||
# appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin"
|
||||
# ):
|
||||
# print(f"ASIN {asin} 的处理结果: {status}")
|
||||
# print("已完成操作")
|
||||
|
||||
front_end_data = {"top_sellers": [{"rank": 1, "price": "36.81", "stock": "5", "shop_name": "Windera"}, {"rank": 2, "price": "36.50", "stock": "100", "shop_name": "Jianhuang 888"}], "cart_seller": "Windera", "timestamp": "2026-04-25 09:32:58"}
|
||||
current_Price = 36.50
|
||||
current_shop_name = "Jianhuang 888"
|
||||
recommended_price = 36.81
|
||||
recommended_shipping = 0
|
||||
calculate_target_price(
|
||||
front_end_data, current_Price, current_shop_name,
|
||||
recommended_price, recommended_shipping
|
||||
)
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -5,9 +5,9 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>格式转换 - 数富AI</title>
|
||||
<script type="module" crossorigin src="/assets/convert.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/convert-7wWJ02Tw.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>数据去重 - 数富AI</title>
|
||||
<script type="module" crossorigin src="/assets/dedupe.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/dedupe-BpNHwt51.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>删除品牌 - 数富AI</title>
|
||||
<script type="module" crossorigin src="/assets/delete-brand.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/delete-brand-CWLpe7lu.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>数据拆分 - 数富AI</title>
|
||||
<script type="module" crossorigin src="/assets/split.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
|
||||
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
|
||||
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/split-CRUIYKS6.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -401,6 +401,7 @@
|
||||
<span class="nav-item disabled">采集数据</span>
|
||||
<span class="nav-item disabled">变体分析</span>
|
||||
<button type="button" class="nav-item active" data-panel="brandCheck">品牌检测</button>
|
||||
<a class="nav-item" href="/new_web_source/appearance-patent.html">外观专利检测</a>
|
||||
<a class="nav-item" href="/new_web_source/dedupe.html">数据去重</a>
|
||||
<a class="nav-item" href="/new_web_source/split.html">数据拆分</a>
|
||||
<a class="nav-item" href="/new_web_source/convert.html">格式转换</a>
|
||||
@@ -413,7 +414,7 @@
|
||||
<a class="nav-item" href="/new_web_source/product-risk.html">商品风险解决</a>
|
||||
<a class="nav-item" href="/new_web_source/shop-match.html">定时匹配</a>
|
||||
<a class="nav-item" href="/new_web_source/price-track.html">跟价</a>
|
||||
<span class="nav-item disabled">巡店删除</span>
|
||||
<a class="nav-item" href="/new_web_source/patrol-delete.html"巡店删除</a>
|
||||
<a class="nav-item" href="/new_web_source/query-asin.html">查询ASIN</a>
|
||||
<span class="nav-item disabled">取款</span>
|
||||
<span class="nav-item disabled">店铺状态查询</span>
|
||||
|
||||
Reference in New Issue
Block a user