package com;
import com.alibaba.fastjson.JSONObject;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import net.sf.ehcache.util.ProductInfo;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.safety.Whitelist;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.TimeZone;
import java.util.logging.Level;
/**
* @author lily
*/
public class PriceCheckUtil {
private PriceCheckUtil() {
}
private static final PriceCheckUtil instance = new PriceCheckUtil();
public static PriceCheckUtil getInstance() {
return instance;
}
/**
* 商品汉字转码
*
* @param productName 商品名称
* @return
*/
public String getGbk(String productName) {
String retGbk = "";
try {
retGbk = new String(productName.getBytes("UTF-8"), "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retGbk;
}
/**
* 对淘宝浏览器汉字进行转换
*
* @param productName 商品名称
* @return
*/
public String getUrlCode(String productName) {
String retUrlCode = "";
try {
retUrlCode = URLEncoder.encode(productName, "utf8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retUrlCode;
}
/**
* 从列表list中找到与productName相似度最高的ProductInfo
*
* @param productName
* @param list
* @return 相似度最高的productName
*/
public ProductInfo getSimilarity(String productName, List<ProductInfo> list) {
ProductInfo productInfo = null;
/**
* 找到list中所有的productName与字符串productName的相似度,保存在lens数组中
*/
double lens[] = new double[list.size()];
for (int i = 0; i < list.size() - 1; i++) {
lens[i] = sim(productName, list.get(i).getName());
}
/**
* 遍历出最大的相似度maxLen
*/
double maxLen = 0.0;
for (int i = 0; i < lens.length; i++) {
if (maxLen < lens[i]) {
maxLen = lens[i];
}
}
/**
* 遍历出最大的相似度的索引maxLenIndex
*/
int maxLenIndex = 0;
for (int i = 0; i < lens.length; i++) {
if (maxLen == lens[i]) {
maxLenIndex = i;
}
}
productInfo = list.get(maxLenIndex);
return productInfo;
}
/**
* 求三个数中最小的一个
*
* @param one
* @param two
* @param three
* @return
*/
public int min(int one, int two, int three) {
int min = one;
if (two < min) {
min = two;
}
if (three < min) {
min = three;
}
return min;
}
/**
* 计算矢量距离
* Levenshtein Distance(LD)
*
* @param str1
* @param str2
* @return
*/
public int ld(String str1, String str2) {
int d[][]; //矩阵
int n = str1.length();
int m = str2.length();
int i; //遍历str1的
int j; //遍历str2的
char ch1; //str1的
char ch2; //str2的
int temp; //记录相同字符,在某个矩阵位置值的增量,不是0就是1
if (n == 0) {
return m;
}
if (m == 0) {
return n;
}
d = new int[n + 1][m + 1];
for (i = 0; i <= n; i++) { //初始化第一列
d[i][0] = i;
}
for (j = 0; j <= m; j++) { //初始化第一行
d[0][j] = j;
}
for (i = 1; i <= n; i++) { //遍历str1
ch1 = str1.charAt(i - 1);
//去匹配str2
for (j = 1; j <= m; j++) {
ch2 = str2.charAt(j - 1);
if (ch1 == ch2) {
temp = 0;
} else {
temp = 1;
}
//左边+1,上边+1, 左上角+temp取最小
d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);
}
}
return d[n][m];
}
/**
* 计算相似度
*
* @param str1
* @param str2
* @return
*/
public double sim(String str1, String str2) {
int ld = ld(str1, str2);
return 1 - (double) ld / Math.max(str1.length(), str2.length());
}
/**
* 毫秒转换成hhmmss
*
* @param ms 毫秒
* @return hh:mm:ss
*/
public String msToss(long ms) {
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
String ss = formatter.format(ms);
return ss;
}
/**
* 禁止htmlunit日志输出
*/
public void offLog() {
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);
}
/**
* 获取淘宝数据
*
* @param url
* @return
* @throws Exception
*/
public String getXmlByHtmlunit(String url) throws Exception {
String ret = "";
WebClient webClient = new WebClient(BrowserVersion.CHROME);
// 1 启动JS
webClient.getOptions().setJavaScriptEnabled(false);
// 2 禁用Css,可避免自动二次请求CSS进行渲染
webClient.getOptions().setCssEnabled(false);
// 3 启动客户端重定向
webClient.getOptions().setRedirectEnabled(true);
// 4 JS运行错误时,是否抛出异常
webClient.getOptions().setThrowExceptionOnScriptError(false);
// 5AJAX support
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
// 6 设置超时
webClient.getOptions().setTimeout(JsoupUtil.TIMEOUT); // 设置连接超时时间 ,这里是10S。如果为0,则无限期等待
webClient.getOptions().setUseInsecureSSL(true); //支持https
WebRequest webRequest = new WebRequest(new URL(url));
webRequest.setHttpMethod(HttpMethod.GET); //设置请求方式
HtmlPage page = webClient.getPage(webRequest);
webClient.waitForBackgroundJavaScript(5000); //设置页面等待js响应时间,这个相当重要,不然很可能js还
java爬取各大平台价格
4星 · 超过85%的资源 需积分: 49 29 浏览量
2018-02-28
14:14:28
上传
评论 3
收藏 9KB ZIP 举报
tb_520
- 粉丝: 3
- 资源: 2
最新资源
- NetOps-py通过sftp替换网络设备启动文件
- STM32单片机FPGA毕设电路原理论文报告任务驱动教学法在单片机课程教学中的应用
- STM32单片机FPGA毕设电路原理论文报告任务驱动法在单片机教学中的应用
- STM32单片机FPGA毕设电路原理论文报告人造金刚石压机智能化压力测控系统设计
- 以某列为依据匹配多项(Excel版)
- STM32单片机FPGA毕设电路原理论文报告人体短臂离心机实验台的显示控制系统
- STM32单片机FPGA毕设电路原理论文报告人工气候室监控系统的环境控制器研究
- STM32单片机FPGA毕设电路原理论文报告染整自动线张力控制系统的设计
- 数据挖掘与机器学习-实验
- 基于Linux系统Nginx的动态网站的LNMP环境源码包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈