手记

java 抓取某度彩快乐扑克开奖(2014-02-16到2017-02-20的历史开奖数据)

本人因为工作需要抓取某度网站的数据分享一下
一.工程目录结构

二.本项目引用的jar包

日志配置如下:

log4j.properties
log4j.rootCategory=INFO,R,T
##log4j.rootLogger=INFO,R,T

log4j.appender.T=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.T.File=log\\opencode\\err.log
log4j.appender.T.Threshold=error
log4j.appender.T.layout=org.apache.log4j.PatternLayout
#log4j.appender.T.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.R.File=log\\opencode\\info.log
log4j.appender.R.Threshold=info
log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%m%n 

三.业务逻辑:
1.获取到页面中的开奖数据字符串
//获取开奖页面的目标字符串
String str = getStr( strDay );
2.将抓取的数据放到日志文件中
//将抓取的数据放到日志文件中
makeStr(str);
3.将初始化的日期每次抓取数据的时候增加一天(循环抓取)(直到2017-02-20)
//获取下一天的方法
strDay= getNextDay( strDay);
if( strDay.compareTo("2017-02-20") > 0 )
{
break;
}
四.业务实现代码如下:

java
package com.wincode;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class OpenCode {
    //日志
    private final static Logger logger = LoggerFactory.getLogger(OpenCode.class);

    /*
     * 主入口
     */
    public static void main(String[] args){
        //设置初始值
        String strDay = "2014-02-16";
        while(true){
            //获取开奖页面的目标字符串
            String  str = getStr( strDay );
            //将抓取的数据放到日志文件中
            makeStr(str);
            //获取下一天的方法
            strDay= getNextDay( strDay);
            if( strDay.compareTo("2017-02-20") > 0 )
            {
                break;
            }
            try {
                //抓取完一天的数据休息1秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /*
     * 获取开奖页面的目标字符串
     */
    private static String getStr(String dataTime){

        Document doc;
        String str = null;
        String url = "http://www.lecai.com/lottery/draw/view/567/";

        try {
            doc = Jsoup.connect(url + dataTime).get();
            String[] arr = doc.toString().split(";");
            System.out.println(arr.length);
            for (int i = 0; i < arr.length; i++) {
                if(arr[ i ].indexOf("phaseData") > 0){
                    str = arr[ i ];
                    break;
                }
            }
            str = str.substring(36, str.length()-1);
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return str;
    }

    /*
     * 处理获取到的目标字符串
     */
    private static void makeStr(String str){
        try {
            //将获取到的字符串转化为json数据
            JSONObject json = JSONObject.fromObject(str); 
            //获取json的键
            JSONArray keyList = json.names();
            //遍历json的键
            for (int i = 0; i < keyList.size(); i++) {
                String itemKey = keyList.getString(i);
                System.out.println("第一层的json键:" + itemKey);
                //根据json的键来获取值
                String jsonValue = json.getString(itemKey);
                //System.out.println("第一层的json值:" + jsonValue);
                //将第一层的json值转化为json数据secondJson
                JSONObject secondJson = JSONObject.fromObject(jsonValue);
                //获取第二层secondJson的键
                JSONArray secondKeys = secondJson.names();
                //遍历secondKeys
                for (int j = 0; j < secondKeys.size(); j++) {
                    //secondkey
                    String secondkey = secondKeys.getString(j);
                    if("result".equals(secondkey)){
                        //根据secondKey键来获取值
                        String secondValue = secondJson.getString(secondkey);
                        JSONObject threeJson = JSONObject.fromObject(secondValue);
                        JSONArray threekeys = threeJson.names();
                        for (int k = 0; k < threekeys.size(); k++) {
                            String threekey = threekeys.getString(k);
                            if("red".equals(threekey)){
                                String threeValue = threeJson.getString(threekey);
                                threeValue = threeValue.replace("[", "").replace("]", "").replace(",", "").replace("\"", "");
                                System.out.println("第三层red的值:" + threeValue);
                                logger.info(itemKey+"," + threeValue);
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * 获取下一天的方法
     */
    private static String getNextDay(String timeStr){
        String nextDay = null;
        SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd");
        try {
             Date today = dateFormater.parse(timeStr);
             Calendar   calendar   =   new   GregorianCalendar(); 
             calendar.setTime(today); 
             calendar.add(calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动 
             today=calendar.getTime();   //这个时间就是日期往后推一天的结果 
             nextDay = dateFormater.format(today);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return nextDay;

    }
}

最后 日志文件:
一直到2017年2月20号的快乐扑克3开奖数据

3人推荐
随时随地看视频
慕课网APP

热门评论

好牛逼呀,请问您工作几年了呀

查看全部评论