liubenqiang 发表于 2017-3-10 18:35

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,自己测试)

liubenqiang 发表于 2017-3-10 20:06

wanglaihuai 发表于 2017-3-10 19:28
好厉害的样子,发卡平台到现在还没升级么···不长记性。

有的升级了有的没升级。升级无非是限制IP搜索次数或者加上验证码,都有相应的对策

yzc11111 发表于 2017-8-28 20:41

liubenqiang 发表于 2017-8-28 11:40
导入部分jar包就行了,不知道现在还能不能用,好久没看了

那 大佬 太深奥了 能教教我吗 我是新手 用哪些 然后写成什么.exe 吗

mzussle 发表于 2017-3-10 18:49

感谢分享!

520wangshun 发表于 2017-3-10 18:57

搞来学习一下

wanglaihuai 发表于 2017-3-10 19:28

好厉害的样子,发卡平台到现在还没升级么···不长记性。

woaidky 发表于 2017-3-10 19:58

感谢分享! 学习一下

你不配丶 发表于 2017-3-10 20:09

老哥666,学习一下

lan2602144404 发表于 2017-3-10 20:37

这个有用吗,谢谢分享

lan2602144404 发表于 2017-3-10 20:40

链接挂了

woai412891910 发表于 2017-3-10 21:27

老哥稳啊!!!
页: [1] 2
查看完整版本: Java实现获取105发卡平台的订单信息