前言
足球大小球让球角球是一种受欢迎的赛事方式,它不仅增加了观赛的乐趣,还为球迷提供了一种参与赛事的机会。然而,要在这种预测中取得成功并不容易,需要深入分析和全面的思考,而且需要依赖一定的分析工具,才可做得轻松又准确的分析。
本文将从分析思路和软件工具开发两个方面来探讨足球大小球让球角球分析过程,本人从事软件行业已有十余年,具备软件开发能力,所以设计这类软件就已有一定的技术储备,本人也从事足球分析也有数载,对足球理解比较深刻。
要做好这类软件开发,大概需要按以下步骤去完成。
一、开发平台搭建
开发平台的搭建相对简单,但前提你需要具体一定的技术积累,本次开发平台主要采用JAVA、VUE等流行技术开发,在此就不再具体描述。
二、数据采集
数据采集是关键中的关键,需要找到稳定可靠的采集源,而且数据需要完整,需要根据你后面数据逻辑分析中将要使用到的数据进行采集。本人本次开发主要采集球琛的数据,原因有几个:
1.球琛数据采集完全免费;
2.球琛数据完整;
3.球琛数据采集稳定且不受限;
4.球琛的数据能满足我后面的数据逻辑分析;
下面介绍本次采集的数据范围及采集的部分核心源码。
(1)本次主要采集大小盘、亚盘、欧盘的全场、半场的初盘、即盘、滚盘数据,以及比赛的过程中的技术统计,技术统计明细包括危险进攻数、进攻数、射门数、射正数、红牌数、黄牌数等等,下面是一些球琛采集数据的一些截图:
(2)需要采集到以上数据,就得编写代码,本人采用的是JAVA技术,下面是部分采集的核心源码:
@Override public List<Match> getMatchs() { List<Match> list = new LinkedList<Match>(); String liveUrl="https://live.titan007.com";//GetLivewinSite.getSite();//"https://live.titan007.com";// String url =liveUrl+"/vbsxml/bfdata_ut.js?r=007"+System.currentTimeMillis(); //String url ="http://live.titan007.com/vbsxml/bfdata.js?r=007"+System.currentTimeMillis(); Map<String,String> requestHead = new HashMap<String, String>(); requestHead.put("Referer", liveUrl);// requestHead.put("Connection", "Keep-Alive"); requestHead.put("Host", liveUrl.replace("http://", "").replace("/", "")); //Map<String, String> wkbsMap = new HashMap<String,String>();//TODO CustomCommonConfig.getWkbsMap();//是否同步007未开比赛数据 try { ScriptEngine engine =null; /*//皇冠球队数据 String teamUrl = "http://bf.win007.com/vbsxml/alias2.js"; ScriptEngine engine =null; try{ JavaScriptPage teamPage = (JavaScriptPage) HtmlunitHelper.getPage(teamUrl, null); engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval(teamPage.getContent()); teamPage.getEnclosingWindow().getWebClient().closeAllWindows(); }catch(Exception e){ HtmlPage teamPage = (HtmlPage) HtmlunitHelper.getPage(teamUrl, null); engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval(teamPage.getTextContent()); teamPage.getEnclosingWindow().getWebClient().closeAllWindows(); }*/ Pattern pattern = Pattern.compile("^A\\[+\\d+\\]="); List<String> listStr=new LinkedList<String>(); String spiderUrl=CustomCommonConfig.getInstance().getProperty("spider.url"); if("true".equals(CustomCommonConfig.getInstance().getProperty("sys.python", "false"))){//使用python获取数据 // SearchMap sm=new SearchMap(); // sm.eq("date", DateUtil.format(new Date(), "yyyy-MM-dd")); // List<MatchData> listMatchData=this.matchDAO.findObjects(sm, MatchData.class); // if(listMatchData.size()>0) { // MatchData data=listMatchData.get(0); // String content=data.getMatch_content(); // if(StringUtils.isNotBlank(content)) { // for(String s:content.split(";")) { // if(s.indexOf("A[")!=-1) { // listStr.add(s); // } // } // } // } String bfdata = HtmlunitHelper.getGetResponseWithHttpClient2(spiderUrl+"/bfdata", "GBK"); JSONObject objectJson =JSONObject.fromString(bfdata); String status=objectJson.get("status").toString(); if(!"200".equals(status)) { log.info("采集球琛首页数据失败*******"); return list; } String content=objectJson.get("data").toString(); if(StringUtils.isNotBlank(content)) { for(String s:content.split(";")) { if(s.indexOf("A[")!=-1) { listStr.add(s); } } } }else{ //从网页取得数据 InputStream in =null; try{ JavaScriptPage jspage = (JavaScriptPage) HtmlunitHelper.getPage(url, requestHead); in=jspage.getWebResponse().getContentAsStream(); jspage.getEnclosingWindow().getWebClient().closeAllWindows(); }catch(Exception e){ HtmlPage jspage = (HtmlPage) HtmlunitHelper.getPage(url, requestHead); in=jspage.getWebResponse().getContentAsStream(); jspage.getEnclosingWindow().getWebClient().closeAllWindows(); } InputStreamReader inr = new InputStreamReader(in, "UTF-8"); BufferedReader br = new BufferedReader(inr); String s = null; //String site="live"; while((s=br.readLine())!=null){ if(pattern.matcher(s).find()){ listStr.add(s); } } } //获取指数,sb等数据 Map<String,String[]> goin = this.getGoalin(); //Map<String,String[]> goin =new LinkedHashMap<String,String[]>(); //TODO 临时关闭 //Map<String,String[]> ch_goin =this.getChGoalin(); Map<String,String[]> ch_goin = new LinkedHashMap<String,String[]>(); Map<String,String[][]> sboddsdatas = this.getSbOddsData(liveUrl); //对战记录数据 //List<String[]> pauluDatas = this.getPauluDatas(); //http://live.titan007.com/vbsxml/change.xml?r=0071522770785000 //技术统计数据 //List<Map<String,List<String[]>>> tdatas = this.getDetail(); //Map<String,List<String[]>> drarr = tdatas.get(0); //Map<String,List<String[]>> tcarr = tdatas.get(1); for(String s:listStr) { Match match = new Match(); String strData = s.split("\"", s.lastIndexOf("\""))[1]; String[] data = StringUtil.split(strData,"\\^"); try{ match.setJqqc(data[48]+"-"+data[49]); }catch(Exception e){} match.setId(data[0]); match.setGameName(data[2]); match.setGameFirstName(data[2].substring(0,1)); match.setGameNameC(data[3]); match.setTeams1(data[5].replace("<font color=#880000>", "").replace("</font>", "")); match.setTeams1C(data[6].replace("<font color=#880000>", "").replace("</font>", "")); match.setTeams2(data[8].replace("<font color=#880000>", "").replace("</font>", "")); match.setTeams2C(data[9].replace("<font color=#880000>", "").replace("</font>", "")); match.setScore(data[14]+"-"+data[15]); match.setYellowCard1(Integer.parseInt(data[20])); match.setYellowCard2(Integer.parseInt(data[21])); match.setRedCard1(Integer.parseInt(data[18])); String team1=match.getTeams1(); String team2=match.getTeams2(); try{ team1 = (String)engine.eval("T[\""+data[37]+"_3\"][0]"); team2 = (String)engine.eval("T[\""+data[38]+"_3\"][0]"); team1 = team1.replaceAll(" ", ""); team2 = team2.replaceAll(" ", ""); }catch(Exception e){} try{ match.setRedCard2(Integer.parseInt(data[19])); }catch(Exception e){} team1=team1.replace("U19", ""); team1=team1.replace("U20", ""); team1=team1.replace("U21", ""); team1=team1.replace("U22", ""); team1=team1.replace("U23", ""); team1=team1.replace("B队", ""); team1=team1.replace("(中)", ""); team2=team2.replace("U19", ""); team2=team2.replace("U20", ""); team2=team2.replace("U21", ""); team2=team2.replace("U22", ""); team2=team2.replace("U23", ""); team2=team2.replace("B队", ""); team2=team2.replace("(中)", ""); match.setTeamHg1(team1); match.setTeamHg2(team2); match.setHalfCourt(data[16]+"-"+data[17]); if("-".equals(match.getHalfCourt())){ match.setHalfCourt(match.getScore()); } String[] t = data[12].split(","); int statas = Integer.parseInt(data[13]); Date date = new Date(Integer.parseInt(t[0])-1900,Integer.parseInt(t[1]),Integer.parseInt(t[2]),Integer.parseInt(t[3]),Integer.parseInt(t[4]),Integer.parseInt(t[5])); long gotime = (System.currentTimeMillis() - date.getTime())/(1000*60); String strGotime = ""; try{ if(statas==1){ strGotime = gotime+""; if(gotime>45) strGotime = "45+"; }else if(statas==3){ strGotime = gotime+46+""; if(gotime+46>90) strGotime = "90+"; }else{ strGotime = state_ch[statas+14]; } }catch(Exception e){ //e.printStackTrace(); strGotime=""; log.info("007获取状态出错,team1:"+match.getTeams1()+",statas:"+statas+",gotime:"+gotime+",error:"+e.getMessage()); } match.setStatus(strGotime); // if(match.getStatus()==null||"".equals(match.getStatus())||"推迟".equals(match.getStatus())||"待定".equals(match.getStatus())){ // if(!"true".equals(wkbsMap.get("wkbs"))){ // continue; // } // } /*if("莫斯科斯巴达".equals(team1)||"清水心跳".equals(team1)||"托利马".equals(team1)){ log.info("比赛状态========>>"+strGotime+",team1==>>"+team1); }*/ //log.info("角球比分:"+match.getJqqc()+"==>>"+match.getTeamHg1()+" VS "+match.getTeamHg2()); //String strdataTime = t[0]+"-"+t[1]+"-"+t[2]+" "+data[11]; // 2018,3,10,20,15,00 //log.info("data[12].trim()===>>"+data[12].trim()) match.setDataTime(DateUtils.parseDate(data[12].trim(), "yyyy,MM,dd,HH,mm,ss")); Calendar dateTime = Calendar.getInstance(); dateTime.setTime(match.getDataTime()); dateTime.add(Calendar.MONTH, 1); match.setDataTime(dateTime.getTime()); // Date dataTime = new Date(Integer.parseInt(t[0])-1900,Integer.parseInt(t[1]),Integer.parseInt(t[2]),Integer.parseInt(data[11].split(":")[0]),Integer.parseInt(data[11].split(":")[1]),0); // match.setDataTime(dataTime); String runMath="0"; try{ if(data[28].equals("True")){ String[] data1 = ch_goin.get(match.getId()); if(data1!=null){ if(data1[5].equals("2")) runMath ="2"; }else{ runMath ="1"; } }else{ runMath ="0"; } }catch(Exception e){ log.error("获取runMath异常"); } String[] goindata = goin.get(match.getId()); Double exponential = null; Double sbExponentiald = null; String sb = ""; if(goindata!=null){ if(goindata[14].equals("0")){ try { exponential = Double.parseDouble(goindata[3]); sbExponentiald = Double.parseDouble(goindata[4]); sb = this.Goal2GoalCn(goindata[2]); }catch(Exception e) { log.error("获取SB异常,"+team1+" VS "+team2+",goindata[3]:"+goindata[3]); } }else{ exponential = null; sbExponentiald = null; sb = "封"; } } match.setRunMath(runMath); //String currentDate=CustomDateUtil.format(CustomDateUtil.createSysDate(), "yyyy-MM-dd"); //String key=match.getId();//ID /*if(!"完".equals(match.getStatus())&&!"0".equals(match.getRunMath())){ //非完成,非其它的数据,重新更新 }else{ }*/ // if(CustomCommonConfig.matchMap!=null){ // Map<String,Integer> mapF=CustomCommonConfig.matchMap.get(currentDate); // if(mapF!=null&&mapF.containsKey(key)){//比赛完成时间超出30分钟,停止更机新 // continue; // } // } match.setExponential(exponential); match.setSbExponentiald(sbExponentiald); match.setSb(sb); match.setSysTime(CustomDateUtil.createSysDate()); match.setHandicapReference(Goal2GoalCn(data[29])); this.setSbTeanDatas(data, sboddsdatas.get(data[0]), match); /*if(CustomCommonConfig.matchHalfGameMap!=null&&"1".equals(CustomCommonConfig.matchHalfGameMap.get(match.getId())+"")){ //已同步半场记录 }else{ //解析对战记录 //TODO 临时关闭 //match.setHalfGame(this.getHalfGames(pauluDatas, data)); }*/ //设置入球详情 //List<String[]> drDatas = drarr.get(data[0]); //match.setDiscref(this.getDiscRef(drDatas, data)); //技术统计 //List<String[]> tcDatas = tcarr.get(data[0]); //match.setTechnicalAnalysis(this.getTechnicalAnalysis(tcDatas,data[0])); //完场的比赛,不采集明细 if(!"完".equals(match.getStatus())&&match.getStatus()!=null&&!"".equals(match.getStatus())){ //Thread.sleep(500*1); //String winUrl=liveUrl+"/detail/"+match.getId()+"sb.htm"; //String winUrl310="http://www.310win.com/info/match/detail.aspx?id="+match.getId(); //log.info("采集明细winUrl============"); //match.setTechnicalAnalysis(this.getTechnicalAnalysis(match,winUrl)); //Thread.sleep(1000*2); /*if("live".equals(site)){//用球探网的 match.setTechnicalAnalysis(this.getTechnicalAnalysis(match,winUrl)); if(match.getTechnicalAnalysis()==null){//采集报错,直接切换网站 match.setTechnicalAnalysis(this.getTechnicalAnalysis(match,winUrl310)); } site="310win"; }else{ match.setTechnicalAnalysis(this.getTechnicalAnalysis(match,winUrl310)); if(match.getTechnicalAnalysis()==null){//采集报错,直接切换网站 match.setTechnicalAnalysis(this.getTechnicalAnalysis(match,winUrl)); } site="live"; }*/ //String winUrl="https://live.titan007.com/detail/"+match.getId()+"sb.htm"; //this.getTechnicalAnalysis(match,winUrl); } list.add(match); } //Thread.sleep(1000*2); if("true".equals(CustomCommonConfig.getInstance().getProperty("sys.livewin", "false"))){ Map<String,Match> matchMap=this.setJqData(liveUrl);//设置角球赔率 for(Match model:list){ /*if("金士顿城".equals(model.getTeamHg2())){ log.info("金士顿城********************"); }*/ if(matchMap.containsKey(model.getId())){ Match jqDetail=matchMap.get(model.getId()); model.setJq1(jqDetail.getJq1()); model.setJq2(jqDetail.getJq2()); model.setJq3(jqDetail.getJq3()); //log.info(model.getJq1()+"==>>"+model.getJq2()+"==>>"+model.getJq3()+"==matchId===>>"+model.getId()); } } } } catch (Exception e) { log.error("从网页获取首页数据出错了!"+e.getMessage()); GetLivewinSite.win007Url="https://live.titan007.com/"; e.printStackTrace(); } return list; }
三、数据逻辑整理
第二点中已经采集了赔率相关初盘、即盘、滚盘、技术统计等数据,那么就可以开始编写数据逻辑,本人设计的核心是,根据数据逻辑,去编写提醒筛选数据库语句,然后放在软件中监控跟踪执行,符合条件的比赛进行提醒,并统计对应数据逻辑的胜率情况。
每个老玩家都基本有自己的一套逻辑分析方法,本文简单列举出几种常用的而且简单的逻辑思路,当然其它复杂的逻辑也可以实现,下面拿几个简单的场景进行介绍:
场景一:赔率分析方法,观察赔率的变化调整方向
如主队欧赔目前是小于1.5,赔率相对很低,证明普遍看好主队会胜出,在这个时候再观察主队让球的情况,在主队让球的情况下,盘口低于0.75,双方打平的情况下,则看好主队让球会赢,为什么呢?因为前面根据欧赔已看主队赢,那么比分还是打平的情况下,至少主队还会再进一球,由于盘口较小,所以只要进一球,则主队让球会胜出。
以上就是最基本的赔率逻辑分析,根据某个赔率观察赛果指向方向,然后再选择适当的盘口,适当的赔率进行提示操作。
场景二:观察技术统计的相关变化方向
如危险进攻越高,控球率越高,就越有可能进球,根据这种判断,去选择适当 的盘口,适当 的赔率进行筛选提示。
下面就是我们开发出来的一个筛选语句的填写表单:
四、实现工具筛选并定时统计分析
根据第三点中整理出来的数据逻辑策略,我们就可以进行软件自动筛选,自动提醒,并自动统计胜率了,下面截图就是我们的一个胜率分析列表,成果如下:
结论
要做好足球的分析,这需要多年的观察和经验积累才可得出的有用的结论。
在这个信息丰富的时代,足球大小球让球角球的分析不再是一个孤立的过程。我们可以利用各种数据和统计指标来支撑我们的决策,比如球队的历史战绩、球员的表现数据、赛事的背景等等。然而,仅凭数据是不够的,我们还需要结合赛事的实际情况和球队的特点来进行综合分析,这个过程单依靠人工是不够的,更需要依赖目前流行的技术,节省大量的人工,实现更大批量的筛选分析,为分析决策提供可靠的数据基础。
希望这篇文章,读者能够更好地理解足球大小球让球角球的各种数据逻辑方式的实现,并能够根据自己的分析和判断做出明智的决策。
经常长时间的技术与精力投入,我们终于开发成功,下面是我们的一些技术官网,有需要的可以了解并深入沟通。
: