爬取保存今日已结算
This commit is contained in:
@@ -15,7 +15,7 @@ public class LoginCrawler {
|
|||||||
|
|
||||||
private final LoginService loginService;
|
private final LoginService loginService;
|
||||||
|
|
||||||
// 登入
|
// 登入爬取历史开奖结果
|
||||||
public LoginCrawler(LoginService loginService) {
|
public LoginCrawler(LoginService loginService) {
|
||||||
this.loginService = loginService;
|
this.loginService = loginService;
|
||||||
}
|
}
|
||||||
|
|||||||
44
src/main/java/com/tem/bocai/entity/CompletedToday.java
Normal file
44
src/main/java/com/tem/bocai/entity/CompletedToday.java
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package com.tem.bocai.entity;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Entity //今日完结
|
||||||
|
@Table(name = "completed_today")
|
||||||
|
@Data
|
||||||
|
public class CompletedToday {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(name = "bet_id", nullable = false, unique = true)
|
||||||
|
private String betId; //
|
||||||
|
|
||||||
|
@Column(name = "time", nullable = false)
|
||||||
|
private String time; //
|
||||||
|
|
||||||
|
//下注金额
|
||||||
|
@Column(name = "bet_amount", nullable = false)
|
||||||
|
private Double betAmount;
|
||||||
|
|
||||||
|
//输赢
|
||||||
|
@Column(name = "result", nullable = false)
|
||||||
|
private String result;
|
||||||
|
|
||||||
|
//输赢结果金额
|
||||||
|
@Column(name = "result_amount", nullable = false)
|
||||||
|
private Double resultAmount;
|
||||||
|
|
||||||
|
/* @Column(name = "current_num", nullable = false)
|
||||||
|
private Integer currentNum;*/
|
||||||
|
@Column(name = "create_time", nullable = false, updatable = false)
|
||||||
|
@Temporal(TemporalType.TIMESTAMP)
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
@Column(name = "update_time", nullable = false)
|
||||||
|
@Temporal(TemporalType.TIMESTAMP)
|
||||||
|
private Date updateTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.tem.bocai.repository;
|
||||||
|
|
||||||
|
|
||||||
|
import com.tem.bocai.entity.CompletedToday;
|
||||||
|
import com.tem.bocai.entity.LoginInfoResult;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface CompletedTodayRepository extends JpaRepository<CompletedToday, Long> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.tem.bocai.service;
|
||||||
|
|
||||||
|
import com.tem.bocai.entity.CompletedToday;
|
||||||
|
import com.tem.bocai.param.LoginInfoParam;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface CompletedTodayService {
|
||||||
|
|
||||||
|
void saveCompletedToday(List<CompletedToday> list);
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.tem.bocai.service.impl;
|
||||||
|
|
||||||
|
import com.tem.bocai.entity.CompletedToday;
|
||||||
|
import com.tem.bocai.entity.LoginInfoResult;
|
||||||
|
import com.tem.bocai.param.LoginInfoParam;
|
||||||
|
import com.tem.bocai.repository.CompletedTodayRepository;
|
||||||
|
import com.tem.bocai.repository.LoginInfoRepository;
|
||||||
|
import com.tem.bocai.service.CompletedTodayService;
|
||||||
|
import com.tem.bocai.service.LoginService;
|
||||||
|
import com.tem.bocai.util.*;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import us.codecraft.webmagic.Spider;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class CompletedTodayServiceImpl implements CompletedTodayService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CompletedTodayRepository completedTodayRepository;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveCompletedToday(List<CompletedToday> list) {
|
||||||
|
completedTodayRepository.saveAll(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,10 +1,16 @@
|
|||||||
package com.tem.bocai.util;
|
package com.tem.bocai.util;
|
||||||
|
|
||||||
|
|
||||||
|
import com.tem.bocai.entity.CompletedToday;
|
||||||
|
import com.tem.bocai.repository.CompletedTodayRepository;
|
||||||
|
import com.tem.bocai.repository.LoginInfoRepository;
|
||||||
|
import com.tem.bocai.service.CompletedTodayService;
|
||||||
import org.jsoup.Jsoup;
|
import org.jsoup.Jsoup;
|
||||||
import org.jsoup.nodes.Document;
|
import org.jsoup.nodes.Document;
|
||||||
import org.jsoup.nodes.Element;
|
import org.jsoup.nodes.Element;
|
||||||
import org.jsoup.select.Elements;
|
import org.jsoup.select.Elements;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
import us.codecraft.webmagic.Page;
|
import us.codecraft.webmagic.Page;
|
||||||
import us.codecraft.webmagic.Site;
|
import us.codecraft.webmagic.Site;
|
||||||
import us.codecraft.webmagic.Spider;
|
import us.codecraft.webmagic.Spider;
|
||||||
@@ -17,12 +23,15 @@ import java.util.*;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
||||||
public class CompletedTodayCrawler implements PageProcessor {
|
public class CompletedTodayCrawler implements PageProcessor {
|
||||||
|
|
||||||
private final String token;
|
private final String token;
|
||||||
private Site site;
|
private Site site;
|
||||||
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
|
||||||
|
// 或者提供带参数的构造函数
|
||||||
public CompletedTodayCrawler(String token) {
|
public CompletedTodayCrawler(String token) {
|
||||||
this.token = token;
|
this.token = token;
|
||||||
initSite();
|
initSite();
|
||||||
@@ -76,11 +85,9 @@ public class CompletedTodayCrawler implements PageProcessor {
|
|||||||
extractDebugInfo(html);
|
extractDebugInfo(html);
|
||||||
} else {
|
} else {
|
||||||
System.out.println("解析到 " + betList.size() + " 条注单数据");
|
System.out.println("解析到 " + betList.size() + " 条注单数据");
|
||||||
|
List<CompletedToday> completedTodayList = convertForDatabase(betList);
|
||||||
// 打印部分数据示例
|
SQLiteUtil.saveCompletedToday(completedTodayList);
|
||||||
printSampleData(betList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存原始HTML用于调试
|
// 保存原始HTML用于调试
|
||||||
saveHtmlForDebug(content, url);
|
saveHtmlForDebug(content, url);
|
||||||
}
|
}
|
||||||
@@ -279,29 +286,21 @@ public class CompletedTodayCrawler implements PageProcessor {
|
|||||||
/**
|
/**
|
||||||
* 转换数据结构以适应数据库
|
* 转换数据结构以适应数据库
|
||||||
*/
|
*/
|
||||||
private List<Map<String, Object>> convertForDatabase(List<Map<String, Object>> betList) {
|
private List<CompletedToday> convertForDatabase(List<Map<String, Object>> betList) {
|
||||||
List<Map<String, Object>> dbData = new ArrayList<>();
|
List<CompletedToday> completedTodayList = new ArrayList<>();
|
||||||
|
|
||||||
for (Map<String, Object> bet : betList) {
|
for (Map<String, Object> bet : betList) {
|
||||||
Map<String, Object> dbRecord = new HashMap<>();
|
CompletedToday completedToday = new CompletedToday();
|
||||||
|
|
||||||
dbRecord.put("id", bet.get("bet_id"));
|
completedToday.setBetId((String) bet.get("bet_id"));
|
||||||
dbRecord.put("bet_id", bet.get("bet_id"));
|
completedToday.setTime((String) bet.get("time"));
|
||||||
dbRecord.put("period", bet.get("period"));
|
completedToday.setBetAmount((Double)bet.get("bet_amount"));
|
||||||
dbRecord.put("bet_time", bet.get("time"));
|
completedToday.setResultAmount((Double) bet.get("result_amount"));
|
||||||
dbRecord.put("game_type", bet.get("game_type"));
|
completedToday.setResult((String) bet.get("result"));
|
||||||
dbRecord.put("plate", bet.get("plate"));
|
|
||||||
dbRecord.put("bet_amount", bet.get("bet_amount"));
|
|
||||||
dbRecord.put("rebate_rate", bet.get("rebate_rate"));
|
|
||||||
dbRecord.put("result", bet.get("result"));
|
|
||||||
dbRecord.put("result_amount", bet.get("result_amount"));
|
|
||||||
dbRecord.put("parse_time", bet.get("parse_time"));
|
|
||||||
dbRecord.put("source", bet.get("source"));
|
|
||||||
|
|
||||||
dbData.add(dbRecord);
|
completedTodayList.add(completedToday);
|
||||||
}
|
}
|
||||||
|
return completedTodayList;
|
||||||
return dbData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -378,6 +377,18 @@ public class CompletedTodayCrawler implements PageProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印示例数据
|
||||||
|
*/
|
||||||
|
/* private void saveCompletedToday(List<Map<String, Object>> betList) {
|
||||||
|
for (Map<String, Object> rowData : betList) {
|
||||||
|
// 期数
|
||||||
|
pstmt.setString(1, rowData.get("id").toString());
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Site getSite() {
|
public Site getSite() {
|
||||||
return site;
|
return site;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.tem.bocai.util;
|
package com.tem.bocai.util;
|
||||||
|
|
||||||
|
import com.tem.bocai.entity.CompletedToday;
|
||||||
import com.tem.bocai.entity.LoginInfoResult;
|
import com.tem.bocai.entity.LoginInfoResult;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
@@ -187,6 +188,62 @@ public class SQLiteUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入今日完结数据
|
||||||
|
*/
|
||||||
|
public static boolean saveCompletedToday(List<CompletedToday> list) {
|
||||||
|
if (list == null || list.isEmpty()) return false;
|
||||||
|
|
||||||
|
String sql = """
|
||||||
|
INSERT OR IGNORE INTO completed_today
|
||||||
|
(bet_id, time, bet_amount, result, result_amount, create_time, update_time)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||||
|
""";
|
||||||
|
|
||||||
|
try (Connection conn = getConnection();
|
||||||
|
PreparedStatement pstmt = conn.prepareStatement(sql)) {
|
||||||
|
|
||||||
|
conn.setAutoCommit(false);
|
||||||
|
|
||||||
|
for (CompletedToday data : list) {
|
||||||
|
if (data == null || data.getBetId() == null) continue;
|
||||||
|
|
||||||
|
pstmt.setString(1, data.getBetId());
|
||||||
|
pstmt.setString(2, data.getTime());
|
||||||
|
pstmt.setDouble(3, data.getBetAmount() != null ? data.getBetAmount() : 0.0);
|
||||||
|
pstmt.setString(4, data.getResult() != null ? data.getResult() : "未知");
|
||||||
|
pstmt.setDouble(5, data.getResultAmount() != null ? data.getResultAmount() : 0.0);
|
||||||
|
|
||||||
|
// 使用ISO8601格式: yyyy-MM-dd HH:mm:ss
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
// 处理create_time
|
||||||
|
if (data.getCreateTime() != null) {
|
||||||
|
pstmt.setString(6, sdf.format(data.getCreateTime()));
|
||||||
|
} else {
|
||||||
|
pstmt.setString(6, sdf.format(new Date()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理update_time
|
||||||
|
if (data.getUpdateTime() != null) {
|
||||||
|
pstmt.setString(7, sdf.format(data.getUpdateTime()));
|
||||||
|
} else {
|
||||||
|
pstmt.setString(7, sdf.format(new Date()));
|
||||||
|
}
|
||||||
|
|
||||||
|
pstmt.addBatch();
|
||||||
|
}
|
||||||
|
|
||||||
|
pstmt.executeBatch();
|
||||||
|
conn.commit();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 关闭数据库资源
|
* 关闭数据库资源
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user