Java实现获取105发卡平台的订单信息
虽然难度不大,但是想一次性写的很完整也不是很容易。(这里用到了一个外部jar包,叫做Jsoup,用来解析HTML文档,巨好用)
Jsoup下载链接:https://jsoup.org/packages/jsoup-1.10.2.jar
言归正传,我爬取数据的思路是 1,通过联系方式获得订单号2,通过订单号查询获取订单详情。
所以说这里我们需要分析两个页面,好在两个页面都比较简单
(这里我就不截图了,感兴趣的可以右键查看源码,或者直接F12看一下结构)
这里需要先引入Jsoup中的几个包:
package com.spider;
import java.io.IOException;
import org.jsoup.*;
import org.jsoup.nodes.*;
import org.jsoup.select.*;
然后定义方法getSorceBy_OrderNumber(String orderNumber) 通过订单号获取订单信息
/**
* 根据订单号,查询具体的订单信息
* @param orderNumber
* 订单号
* @return
* 如果成功则返回true,如果出现异常,则返回false
* */
public static boolean getSorceBy_OrderNumber(String orderNumber)
{
try {
//这里订单信息是通过ajax进行返回
Document doc = Jsoup.connect("http://www.105ka.com/"
+ "checkgoods.htm?orderid="+orderNumber).get();
String str = doc.body().text();
System.out.println(decodeUnicode(str));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
}
return true;
}
定义函数get_OrderNumber_ByContact(String contact),通过联系方式获取订单号
public static boolean get_OrderNumber_ByContact(String contact)
{
try {
Document doc = Jsoup.connect("http://www.105ka.com/orderquery.ht"
+ "m?st=contact&kw="+contact).get();
Elements search_result = doc.getElementsByClass("search_result");
Elements contents = search_result.select("tr");
for(int i=1;i<contents.size();i++)
{
getSorceBy_OrderNumber(contents.get(i).getAllElements().get(2).text());
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
}
return true;
}
注意:这里根据订单号获取订单详情的时候,会让你输入密码,而且订单详情是通过ajax返回的,所以需要从源码中找出真实url。并且通过ajax返回的订单信息是unicode编码格式,还需要转换为utf-8编码格式,故定义一个函数用来转换:
/**
* unicode转字符
* */
public static String decodeUnicode(String theString) {
char aChar;
int len = theString.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;) {
aChar = theString.charAt(x++);
if (aChar == '\\') {
aChar = theString.charAt(x++);
if (aChar == 'u') {
// Read the xxxx
int value = 0;
for (int i = 0; i < 4; i++) {
aChar = theString.charAt(x++);
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
value = (value << 4) + aChar - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
outBuffer.append((char) value);
} else {
if (aChar == 't')
aChar = '\t';
else if (aChar == 'r')
aChar = '\r';
else if (aChar == 'n')
aChar = '\n';
else if (aChar == 'f')
aChar = '\f';
outBuffer.append(aChar);
}
} else
outBuffer.append(aChar);
}
return outBuffer.toString();
}
最后测试:直接调用get_OrderNumber_ByContact(String contact)方法即可
(ps:打包代码里用了多线程,105发卡网站加了安全狗,短时间内多次访问会banIP,自己测试)
wanglaihuai 发表于 2017-3-10 19:28
好厉害的样子,发卡平台到现在还没升级么···不长记性。
有的升级了有的没升级。升级无非是限制IP搜索次数或者加上验证码,都有相应的对策 liubenqiang 发表于 2017-8-28 11:40
导入部分jar包就行了,不知道现在还能不能用,好久没看了
那 大佬 太深奥了 能教教我吗 我是新手 用哪些 然后写成什么.exe 吗
感谢分享! 搞来学习一下 好厉害的样子,发卡平台到现在还没升级么···不长记性。 感谢分享! 学习一下 老哥666,学习一下 这个有用吗,谢谢分享 链接挂了
老哥稳啊!!!
页:
[1]
2