【爬虫】爬取某彩票网站的历史数据,并进行分析

RT。

闲来无事,随便找了一个玩彩票的网址,突发奇想把历史开奖结果拉取下来,并进行分析,看看有什么规律可以帮助到买彩票的。。

首先使用抓包工具charles, 分析这个历史开奖结果的请求方式。

看似就两个参数,但是实际上还有一个cookies,这个是最关键的,通过分析js代码,发现会有一个登陆接口去拿cookies,也就是sessionId,拿到后,放入这个历史数据接口的cookies就可以顺利拿到数据啦~~~

然而数据的返回并不是json格式的,是html,所以采用了大名鼎鼎的jsoup来直接分析,具体方式可以百度。

这里直接贴源码~

package com.wsm.lottery.JSSC10;

import com.alibaba.fastjson.JSON;
import com.wsm.lottery.dao.LotteryJsscDAO;
import com.wsm.lottery.dao.LotteryJsscDAOImpl;
import com.wsm.lottery.dao.LotteryJsscDO;
import com.wsm.lottery.utils.DateUtils;
import com.wsm.lottery.utils.HttpUtils;
import com.wsm.lottery.model.JSSC10;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.util.*;

public class JSSC10Crawler {

    private static final String JSSC10Url = "**************";

    private static final LotteryJsscDAO lotteryDao = new LotteryJsscDAOImpl();

    public static void main(String[] args) throws Exception{

        String today = DateUtils.getCurrentDate();

        System.out.println(today);

        Date date = new Date();
        int i=20;
        while(i>5){
            Date newDate = DateUtils.addDay(date,-i);
            i--;
            String todayNew = DateUtils.dateToString(newDate);
            spiderDataIntoDB(todayNew);
        }

    }

    public static void spiderDataIntoDB(String today) throws Exception{
        //1、获取sessionID
        String cashUrl = JSSC10Url + "/cashlogin";
        Map param = new HashMap();

        param.put("account","!guest!");
        param.put("password","!guest!");

        String sessionId = JSON.parseObject(HttpUtils.postForm(cashUrl,param)).getString("message");

        //2、获取游客权限--将session注入  测试无需。
        //GET member/agreement?_OLID_=2ba5aebd150775549fa83a5cfba750297d887bd1 HTTP/1.1
        System.out.println(sessionId);
//        HttpUtils.getSessionId(JSSC10Crawler+"member/agreement?"+sessionId);

        //3、请求历史记录
        //87c1bf6e271f = sessionId
        Map headMap = new HashMap();
        headMap.put("Cookie","87c1bf6e271f"+sessionId.substring(sessionId.indexOf("=")));
        String jsUrl = JSSC10Url + "member/dresult?lottery=PK10JSC&date=";

        String resHtml = HttpUtils.get(jsUrl+today,headMap);

        Document resultDocument = Jsoup.parse(resHtml);

        //#drawTable > table > tbody > tr:nth-child(1) > td.period
        //#drawTable > table > tbody > tr:nth-child(1) > td.drawTime
        //#drawTable > table > tbody > tr:nth-child(1) > td:nth-child(3) > span
        //#drawTable > table > tbody > tr:nth-child(1104) > td:nth-child(3) > span

        //4、解析html
        List<JSSC10> jssc10List = new ArrayList<>();
        int i = 1;
        while (true){

            String trChild = "tr:nth-child("+i+")";
            Elements period = resultDocument.select("#drawTable")
                    .select("table").select("tbody").select(trChild).select("td.period");
            Elements drawTime = resultDocument.select("#drawTable")
                    .select("table").select("tbody").select(trChild).select("td.drawTime");

            if (period.isEmpty()){
                break;
            }
            JSSC10 jssc10 = new JSSC10();
            jssc10.setPeriod(period.text());

            String time = drawTime.text();
            time = "2018-" + time.substring(0,5) + " "+ time.substring(time.length()-8);

            jssc10.setDrawTime(DateUtils.stringToDate(time,DateUtils.DATE_TIME_FORMAT));
            List<Integer> ballNames = new ArrayList<>();

            for (int j=3; j<=12; j++){

                String tdChild = "td:nth-child("+j+")";
                Elements ballName = resultDocument.select("#drawTable")
                        .select("table").select("tbody").select(trChild).select(tdChild).select("span");

                ballNames.add(Integer.valueOf(ballName.text()));
            }

            jssc10.setBallNames(ballNames);
            System.out.println(jssc10);
            jssc10List.add(jssc10);
            i ++;

        }

        //分析数据
        System.out.println(jssc10List);

        //插入DB

        for(JSSC10 jssc10 : jssc10List){
            LotteryJsscDO lotteryJsscDO = new LotteryJsscDO();

            lotteryJsscDO.setCreatePin("siming.wang");
            lotteryJsscDO.setCreateTime(new Date());
            lotteryJsscDO.setPeriod(jssc10.getPeriod());
            lotteryJsscDO.setDrawTime(jssc10.getDrawTime());

            List<Integer> ballNames = jssc10.getBallNames();
            lotteryJsscDO.setBallOne(ballNames.get(0));
            lotteryJsscDO.setBallTwo(ballNames.get(1));
            lotteryJsscDO.setBallThree(ballNames.get(2));
            lotteryJsscDO.setBallFour(ballNames.get(3));
            lotteryJsscDO.setBallFive(ballNames.get(4));
            lotteryJsscDO.setBallSix(ballNames.get(5));
            lotteryJsscDO.setBallSeven(ballNames.get(6));
            lotteryJsscDO.setBallEight(ballNames.get(7));
            lotteryJsscDO.setBallNine(ballNames.get(8));
            lotteryJsscDO.setBallTen(ballNames.get(9));
            lotteryJsscDO.setYn("Y");

            Map paramDb = new HashMap();
            paramDb.put("period",lotteryJsscDO.getPeriod());
            List<LotteryJsscDO> lotteryJsscDOS = lotteryDao.selectListByMap(paramDb);

            if(lotteryDao.selectListByMap(paramDb).isEmpty()){
                lotteryDao.insert(lotteryJsscDO);
            }

        }
    }

}

数据库对应的表结构这里也贴一下:

CREATE TABLE `lottery_jssc` (
  `sys_no` bigint(20) NOT NULL AUTO_INCREMENT,
  `period` varchar(125) DEFAULT NULL,
  `draw_time` datetime DEFAULT NULL,
  `ball_one` int(2) DEFAULT NULL,
  `ball_two` int(2) DEFAULT NULL,
  `ball_three` int(2) DEFAULT NULL,
  `ball_four` int(2) DEFAULT NULL,
  `ball_five` int(2) DEFAULT NULL,
  `ball_six` int(2) DEFAULT NULL,
  `ball_seven` int(2) DEFAULT NULL,
  `ball_eight` int(2) DEFAULT NULL,
  `ball_nine` int(2) DEFAULT NULL,
  `ball_ten` int(2) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `create_pin` varchar(20) DEFAULT NULL,
  `Yn` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`sys_no`),
  KEY `idx_period` (`period`),
  KEY `idx_draw_time` (`draw_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=103311 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

查看表结构ddl

采用的是mybatis+druid,相关配置我已经提交到了github,文末会有相关地址。

最后是分析啦~

直接贴分析结果,以一天为例子,代码可以去github下载。

----------开始分析从2018-09-14 07:00:30到2018-09-15 05:59:15的数据-----------
分析1,出现对子,就买13568 10 :
1期购买中奖次数:331
2期购买中奖次数:113
3期购买中奖次数:52
4期购买中奖次数:9
5期购买中奖次数:4
6期购买中奖次数:1
分析2,出现对子12359,就买68 10 :
1期购买中奖次数:102
2期购买中奖次数:88
3期购买中奖次数:67
4期购买中奖次数:36
5期购买中奖次数:27
6期购买中奖次数:14
7期购买中奖次数:5
8期购买中奖次数:2
9期购买中奖次数:1
分析3,出现对子46780,就买135 :
1期购买中奖次数:87
2期购买中奖次数:79
3期购买中奖次数:52
4期购买中奖次数:24
5期购买中奖次数:20
6期购买中奖次数:14
7期购买中奖次数:4
8期购买中奖次数:4
9期购买中奖次数:3
10期购买中奖次数:1
---------------2018-09-14 数据分析结束!
*

查看分析结果-例子

GITHUB地址:https://github.com/wangchaun/lottery-crawlers

欢迎一起交流~

原文地址:https://www.cnblogs.com/wangsiming/p/9657839.html

时间: 2024-10-25 21:52:33

【爬虫】爬取某彩票网站的历史数据,并进行分析的相关文章

Python爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间.之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了.但是,作为一个宅diao的我又怎甘心没剧追呢,所以网上随便查了一下就找到一个能用迅雷下载的美剧下载网站[天天美剧],各种资源随便下载,最近迷上的BBC的高清纪录片,大自然美得不要不要的. 虽说找到了资源网站可以下载了,但是每次都要打开浏览器,输入网址,找到该美剧,然后点击链接才能下载.时间长了就觉得过程好繁琐,而且有时候网

如何防止网站被爬虫爬取的几种办法

如何防止网站被爬虫爬取的几种办法 小 中 大 chen 2013-10-08 23:26 Linux 547 次浏览 抢沙发 今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对web服务器有比较性能有影响,主要的表现就是会变得很慢. 对于如何防止网站被爬取,我想从以下几种方法去分析: 1.基于程序本身去防止爬取:作为爬虫程序,爬取行为是对页面的源文件爬取,如爬取静态页面的html代码,可以用jquery去模仿写h

如何使用robots禁止各大搜索引擎爬虫爬取网站

ps:由于公司网站配置的测试环境被百度爬虫抓取,干扰了线上正常环境的使用,刚好看到每次搜索淘宝时,都会有一句由于robots.txt文件存在限制指令无法提供内容描述,于是便去学习了一波 1.原来一般来说搜索引擎爬取网站时都会,先读取下robots.txt文件,并依照里面所设定的规则去爬取网站(当然是指没用登录限制的页面) 2.下面我们就来说一说如何设置robots.txt文件 1).robots.txt文件必须是放在文件根目录上: 例如: ├─admin │  └─templates │    

使用node爬虫,爬取指定排名网站的JS引用库

前期准备 本爬虫将从网站爬取排名前几的网站,具体前几名可以具体设置,并分别爬取他们的主页,检查是否引用特定库. github地址 所用到的node主要模块 express 不用多说 request http模块 cheerio 运行在服务器端的jQuery node-inspector node调试模块 node-dev 修改文件后自动重启app 关于调试Node 在任意一个文件夹,执行node-inspector,通过打开特定页面,在页面上进行调试,然后运行app,使用node-dev app

用Python爬虫爬取广州大学教务系统的成绩(内网访问)

用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是"选择器"."选择器"指明了{}中的"样式"的作用对象,也就是"样式"作用于网页中的哪些元素.可参考:http://www.w3school.com.cn/cssref/css_selectors.asph

python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)

转载出处:药少敏   ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: 1 from bs4 import BeautifulSoup 2 import requests 3 4 if __name__ == '__main__': 5 html = requests.get('http://www.136book.com/huaqiangu/') 6 soup = BeautifulSoup(html.content, 'lxml'

Python爬虫爬取数据的步骤

爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多网页的变化规律,基本上都是只有小部分有所变化,如:有的网页只有网址最后的数字在变化,则这种就可以通过变化数字将多个网页链接获取: 2.把获取得到的多个网页链接存入字典,充当一个临时数据库,在需要用时直接通过函数调用即可获得: 3.需要注意的是我们的爬取并不是随便什么网址都可以爬的,我们需要遵守我们的

python爬虫—爬取英文名以及正则表达式的介绍

python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个csv文件中:再读取csv文件当中的每个英文名链接,采用循环的方法读取每一个英文名链接,根据每个英文名链接爬取每个链接中的数据,保存在新的csv文件当中. 需要写一个爬取英文名链接的函数.将爬取的内容保存在csv文件的函数以及读取csv文件内容的函数.爬取英文名详情页内容的函数. 表5.3.1 函数名

Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情

Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情 先识别商品url,区分平台提取商品编号,再根据平台带着商品编号爬取数据. 1.导包 <!-- 爬虫相关Jar包依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10-FINAL</version> </