本人因为工作需要抓取某度网站的数据分享一下
一.工程目录结构
二.本项目引用的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开奖数据
热门评论
好牛逼呀,请问您工作几年了呀