提交 e027f6dc authored 作者: 梁业锦's avatar 梁业锦 💬

重写 AfriesHop 的爬虫逻辑

上级 7fa35391
......@@ -21,9 +21,11 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
/**
* afri-eshop 数据爬虫
* afrieshop 数据爬虫
*
* @author G
* @version 1.1
* @author 爱酱油不爱醋
*/
@Component("africaShopItemSpider")
public class AfricaShopItemSpider implements IItemSpider {
......@@ -37,50 +39,167 @@ public class AfricaShopItemSpider implements IItemSpider {
//获取商品相关信息,详情放在<script> 标签里 <script type="application/json" id="ProductJson-product-template">
resultObj = JsoupUtil.getScriptContentById(content, "ProductJson-product-template");
//格式化为封装数据
ProductResponse productResponse = formatProductResponse(resultObj);
ProductResponse productResponse = formatProductResponse2(resultObj);
resultObj = JSONObject.fromObject(productResponse);
//翻译
TranslateHelper.translateProductResponse(resultObj);
return resultObj;
}
/**
* 格式化 afric-eshop 返回数据
* @param resultObj
* @return
*/
private ProductResponse formatProductResponse2(JSONObject resultObj) {
System.err.println(resultObj);
// 声明封装类
ProductResponse productResponse = new ProductResponse();
// 含有商品的属性,设置为true
productResponse.setPropFlag(true);
// 无库存信息
productResponse.setStockFlag(false);
// 库存信息,如果没有可使用的库存信息则默认为999
DynStock dynStock = new DynStock();
dynStock.setSellableQuantity(9999);
List<ProductSkuStock> productSkuStockList = dynStock.getProductSkuStockList();
// 产品的原始价与优惠价
List<OriginalPrice> originalPriceList = new ArrayList<>();
List<ProductPromotion> promotionList = new ArrayList<>();
// 商品的属性,常用的商品属性为颜色与尺码
Map<String, Set<ProductProp>> productPropSet = new HashMap<>(16);
Set<ProductProp> propSet1 = new HashSet<>(16);
Set<ProductProp> propSet2 = new HashSet<>(16);
// 商品的基本属性
ItemInfo itemInfo = new ItemInfo();
//////////////////////////////////// 获取商品基本信息 ////////////////////////////
itemInfo.setItemId(resultObj.getString("id"));
//取第一张
itemInfo.setShopName(PlatformEnum.AfriEshop.getValue());
itemInfo.setShopUrl("https://www.afrieshop.com/");
itemInfo.setTitle(resultObj.getString("title"));
//////////////////////////////////// 获取商品基本信息End /////////////////////////
// 该商品拥有的属性
JSONArray optionsArray = resultObj.getJSONArray("options");
// 商品列表
JSONArray variantsArray = resultObj.getJSONArray("variants");
List<String> options = new ArrayList<>(3);
// 获取所有的属性名
for (int i = 0; i < optionsArray.size(); i++) {
options.add(optionsArray.getString(i));
}
for (int i = 0; i < variantsArray.size(); i++) {
JSONObject variantsObj = variantsArray.getJSONObject(i);
String title = variantsObj.getString("title");
String[] optionStr = title.split("/");
for (int j = 0; j < options.size(); j++) {
String optionName = options.get(j); // 商品的属性名
String option = optionStr[j].trim(); // 商品的属性值
//商品属性
Set<ProductProp> propSet = new HashSet<>();
ProductProp productProp = new ProductProp();
if (variantsObj.containsKey("featured_image") && !"null".equals(variantsObj.getString("featured_image"))) {
productProp.setImage(variantsObj.getJSONObject("featured_image").getString("src"));
} else {
productProp.setImage(resultObj.getString("featured_image"));
}
productProp.setPropId(option);
productProp.setPropName(option);
propSet.add(productProp);
if (productPropSet.get(optionName) == null) {
productPropSet.put(optionName, propSet);
} else {
Set<ProductProp> oldPropSet = productPropSet.get(optionName);
propSet.addAll(oldPropSet);
productPropSet.put(optionName, propSet);
}
}
String skuStr = "";
if (optionStr.length > 1) {
skuStr = ";" + optionStr[0] + ";" + optionStr[1] + ";";
} else {
skuStr = ";" + optionStr[0] + ";";
}
///////////////////原始价////////////////////////////////////
OriginalPrice originalPrice = new OriginalPrice();
String price = variantsArray.getJSONObject(i).getString("price");
BigDecimal priceOld = new BigDecimal(price);
BigDecimal div = new BigDecimal("100");
BigDecimal priceNew = priceOld.divide(div, 2, BigDecimal.ROUND_DOWN);
originalPrice.setPrice(priceNew.toString());
originalPrice.setSkuStr(skuStr);
originalPriceList.add(originalPrice);
///////////////////原始价 END////////////////////////////////
////////////////////////////////////获取库存 ////////////////
// 设置:商品包含库存信息
if (productSkuStockList == null) {
productSkuStockList = new ArrayList<>();
}
ProductSkuStock productSkuStock = new ProductSkuStock();
productSkuStock.setSellableQuantity(999);
productSkuStock.setSkuStr(skuStr);
productSkuStockList.add(productSkuStock);
dynStock.setProductSkuStockList(productSkuStockList);
////////////////////////////////////获取库存 END/////////////
}
productResponse.setProductPropSet(productPropSet);
productResponse.setPlatform("Afrieshop");
productResponse.setPromotionList(promotionList);
productResponse.setOriginalPriceList(originalPriceList);
productResponse.setItemInfo(itemInfo);
productResponse.setDynStock(dynStock);
return productResponse;
}
/**
* 格式化 afric-eshop 返回数据
*
* @param resultObj
* @return
*/
@Deprecated
private ProductResponse formatProductResponse(JSONObject resultObj) {
System.err.println(resultObj);
ProductResponse productResponse = new ProductResponse();
//原始价
// 原始价
List<OriginalPrice> originalPriceList = new ArrayList<>();
//促销价格
// 促销价格
List<ProductPromotion> promotionList = new ArrayList<>();
//库存
// 库存
DynStock dynStock = new DynStock();
//其实数据没有包含确切的库存数,这里默认给足量的库存
// 其实数据没有包含确切的库存数,这里默认给足量的库存
dynStock.setSellableQuantity(9999);
//nike 基本是 颜色、尺码属性
// nike 基本是 颜色、尺码属性
Map<String, Set<ProductProp>> productPropSet = new HashMap<>();
//商品基本信息
// 商品基本信息
ItemInfo itemInfo = new ItemInfo();
JSONArray variantsArray = resultObj.getJSONArray("variants");
//属性
// 属性
JSONArray optionsArray = resultObj.getJSONArray("options");
for (int i = 0; i < variantsArray.size(); i++) {
//属性
// 属性
JSONArray itemOptionsArray = variantsArray.getJSONObject(i).getJSONArray("options");
String skuStr = ";";
for (int m = 0; m < itemOptionsArray.size(); m++) {
skuStr = skuStr + KeyConstant.CUSTOMIZE_ID + itemOptionsArray.getString(m) + ";";
}
//没有属性的时候,会返回 Default Title
if ("Default Title".equalsIgnoreCase(itemOptionsArray.getString(0))) {
}
///////////////////原始价////////////////////////////////////
OriginalPrice originalPrice = new OriginalPrice();
String price = variantsArray.getJSONObject(i).getString("price");
......@@ -91,7 +210,8 @@ public class AfricaShopItemSpider implements IItemSpider {
originalPrice.setSkuStr(skuStr);
originalPriceList.add(originalPrice);
///////////////////原始价 END////////////////////////////////
////////////////////////////////////获取库存 ////////////////////////////////////////////
////////////////////////////////////获取库存 ////////////////
productResponse.setStockFlag(true);
List<ProductSkuStock> productSkuStockList = dynStock.getProductSkuStockList();
if (productSkuStockList == null) {
......@@ -103,10 +223,11 @@ public class AfricaShopItemSpider implements IItemSpider {
productSkuStock.setSkuStr(skuStr);
productSkuStockList.add(productSkuStock);
dynStock.setProductSkuStockList(productSkuStockList);
////////////////////////////////////获取库存 END////////////////////////////////////////////
////////////////////////////////////获取库存 END/////////////
//获取所有的属性
for (int j = 0; j < optionsArray.size(); j++) {
////////////////////////////////////获取商品属性////////////////////////////////////////////
////////////////////////////////////获取商品属性/////////
//商品属性
Set<ProductProp> propSet = new HashSet<>();
ProductProp productProp = new ProductProp();
......@@ -120,10 +241,10 @@ public class AfricaShopItemSpider implements IItemSpider {
propSet.addAll(oldPropSet);
productPropSet.put(optionsArray.getString(j), propSet);
}
////////////////////////////////////获取属性 END////////////////////////////////////////////
////////////////////////////////////获取属性 END/////////
}
}
itemInfo.setItemId(resultObj.getString("id"));
//取第一张
itemInfo.setPic(resultObj.getString("featured_image"));
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论