提交 50becc76 authored 作者: zhengfg's avatar zhengfg 提交者: 张光耀

爬虫提交

上级 591f8b9e
package com.diaoyun.zion.chinafrica.bis.impl;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
/**
* TODO Gap美国休闲品牌数据爬虫
*
* 分析:产品数据在 F12 的 Network 中的 "spu.do" 文件中,该文件返回产品的 Json 数据
*/
@Component("gapSpider")
public class GapSpider implements IItemSpider {
@Override
public JSONObject captureItem(String targetUrl) throws URISyntaxException, IOException, ExecutionException, InterruptedException, TimeoutException {
return null;
}
}
......@@ -94,8 +94,6 @@ public class TbItemSpider implements IItemSpider {
return returnJson;
}
/**
* 翻译规格属性
* @param propMap 规格属性MAP
......
package com.diaoyun.zion.chinafrica.bis.impl;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import com.diaoyun.zion.chinafrica.enums.PlatformEnum;
import com.diaoyun.zion.master.util.HttpClientUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.http.Consts;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
/**
* TODO 优衣库数据爬虫
*/
@Component("uniqloSpider")
public class UniqloSpider implements IItemSpider {
private static Logger logger = LoggerFactory.getLogger(UniqloSpider.class);
@Override
public JSONObject captureItem(String targetUrl) throws URISyntaxException, IOException, ExecutionException, InterruptedException, TimeoutException {
return null;
}
}
package com.diaoyun.zion.chinafrica.bis.impl;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import com.diaoyun.zion.chinafrica.enums.PlatformEnum;
import com.diaoyun.zion.master.util.HttpClientUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
/**
* Zara西班牙时尚品牌数据爬虫
*/
@Component("zaraSpider")
public class ZaraSpider implements IItemSpider {
private static Logger logger = LoggerFactory.getLogger(TmItemSpider.class);
//西班牙时尚品牌数据爬虫
private static final String zaraUrl = "https://www.zara.cn/cn/zh/";
@Override
public JSONObject captureItem(String targetUrl) throws URISyntaxException, IOException, ExecutionException, InterruptedException, TimeoutException {
// 获取url中的网页内容
String content = HttpClientUtil.getContentByUrl(targetUrl, PlatformEnum.ZARA.getValue());
// 截取主要的 Json 内容
String jsonDataStr = getDataJson(content, "dataLayer", ";window.zara.viewPayload")
.replace("dataLayer = ", "");
// 转换为 Json 格式
JSONObject jsonObject = JSONObject.fromObject(jsonDataStr);
return jsonObject;
}
/**
* 根据首位字符串内容进行截取
* @param jsonStr
* @param startStr 起始字符串
* @param lastStr 结尾字符串(不包含)
* @return
*/
private static String getDataJson(String jsonStr, String startStr, String lastStr) {
int startIndex = jsonStr.indexOf(startStr);
int lastIndex = jsonStr.lastIndexOf(lastStr);
return jsonStr.substring(startIndex, lastIndex);
}
public static void main(String[] args) throws IOException, URISyntaxException {
// URL链接
String targetUrl = "https://www.zara.cn/cn/zh/%E5%BA%9C%E7%BB%B8%E9%95%BF%E7%89%88%E8%A1%AC%E8%A1%AB-p08053157.html?v1=31979171&v2=1319321";
// 获取网页内容
String content = HttpClientUtil.getContentByUrl(targetUrl, PlatformEnum.ZARA.getValue());
// 截取主要的商品数据
int labelHeadIndex = content.indexOf("dataLayer");
int labelTailIndex = content.lastIndexOf(";window.zara.viewPayload");
String abv = content.substring(labelHeadIndex, labelTailIndex).replace("dataLayer = ", "");
System.err.println(abv);
// 转换为 Json 格式
JSONObject json = JSONObject.fromObject(abv);
// System.err.println(json);
// product 对象节点
JSONObject responseData = json.getJSONObject("product");
// System.err.println(responseData);
// detail 对象节点
JSONObject details = responseData.getJSONObject("detail");
// System.err.println(details);
// colors 数组节点
JSONArray colorsArray = details.getJSONArray("colors");
Map<Integer, JSONObject> colorMap = new HashMap<>();
for (int i = 0; i < colorsArray.size(); i++) {
colorMap.put(i, colorsArray.getJSONObject(i));
}
System.out.println(colorMap);
// TODO 取出颜色属性
// sizes 数组节点
Map<Integer, JSONObject> sizesMap = new HashMap<>();
for(Map.Entry<Integer, JSONObject> entry : colorMap.entrySet()){
// 遍历出每个 colors 对象节点
JSONObject colors = entry.getValue();
JSONArray sizesArray = colors.getJSONArray("sizes");
for (int i = 0; i < sizesArray.size(); i++) {
sizesMap.put(i, sizesArray.getJSONObject(i));
}
}
System.out.println(sizesMap);
// TODO 取出价格和尺码属性
// TODO 取出图片属性(图片实体类未知)
}
}
......@@ -12,6 +12,9 @@ public enum PlatformEnum implements EnumItemable<PlatformEnum> {
TB("淘宝", "tb"),
TM("天猫", "tm"),
ZARA("西班牙时尚品牌", "zara"),
UNIQLO("优衣库", "uniqlo"),
GAP("Gap美国休闲品牌", "gap"),
UN("未知", "un");
private String label;
......
......@@ -4,6 +4,8 @@ import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import com.diaoyun.zion.chinafrica.enums.PlatformEnum;
import com.diaoyun.zion.master.util.SpringContextUtil;
import javax.swing.*;
/**
* 商品爬虫
*/
......@@ -12,14 +14,31 @@ public class ItemSpiderFactory {
public static IItemSpider getSpider(PlatformEnum platformEnum) {
IItemSpider iItemSpider;
switch (platformEnum.getValue()) {
// 淘宝
case "tb":{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("tbItemSpider");
break;
}
// 天猫
case "tm":{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("tmItemSpider");
break;
}
// zara 西班牙快时尚品牌
case "zara":{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("zaraSpider");
break;
}
// 优衣库
case "uniqlo":{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("uniqloSpider");
break;
}
// Gap 美国休闲品牌
case "gap":{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("gapSpider");
break;
}
default:{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("emptyItemSpider");
break;
......
......@@ -20,6 +20,7 @@ import java.util.regex.Pattern;
public class JsoupUtil {
public static String unknow = "未知";
private static Logger logger = LoggerFactory.getLogger(JsoupUtil.class);
/**
* 获取淘宝商品详情的信息 店铺id 名字 主图 sibUrl 等
*
......@@ -97,6 +98,7 @@ public class JsoupUtil {
}
return configGroup;
}
/**
* 根据script中的变量名获取script中变量相关的内容,特指天猫的返回信息 没什么用,没有商品的规格信息
*
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论