Python爬虫实现大乐透历史数据抓取

前言

公司楼下恰好毗邻中国体育彩票中心,午间饭后,与同事们总会相约前往,各自投下两注希望,既是为中国的公益事业贡献一份力量,也怀揣着对瞬间改变命运的微妙幻想。对于中奖概率的理性认知,我们并不缺乏,但内心深处那份对暴富的坚信始终炽热不减。

根据个人生日、幸运数字等具有特殊意义的元素,我们精心挑选了一组心仪的大乐透号码,并坚持定期投注,让这份期待成为日常的一部分。随着时间的推移,一个自然而然的念头悄然升起——这组寄托了我们梦想的大乐透号码,是否在过往的开奖历史中已悄然绽放?

为了解答这份好奇,我迅速利用搜索引擎寻找查询历史开奖记录的方法。若现成的工具或平台未能满足需求,我便萌生了自行开发查询工具的想法,希望通过技术手段,为自己和同样怀揣梦想的人们提供一份便捷与希望。
果然已有同僚想到了,搜到了一个 china-ssq(http://china-ssq.net)电脑端、手机端浏览器都可访问,截图如下:
大乐透历史中奖查询开奖对比器
看了下网站的功能,主要涉及大乐透开奖对比器和双色球开奖对比器功能,提供大乐透号码是否中过奖,双色球号码是否中过奖、中奖通知等功能:

  1. 历史中奖查询:查询您心仪的号码(单式)是否已经在历史期数中开过奖,以供您参考
  2. 复式历史中奖查询:查询您所选的号码(复式)在历史开奖中,红球重复n球及以上的纪录
  3. 历史重复开奖记录查询:检索所有的历史开奖记录,查看是否有重复的开奖号码
  4. 中奖通知:在本站收藏您的幸运号码,我们将实时监控幸运号码的中奖情况,并第一时间通知到您

对于这个网站的具体运营时长及作者是否已实现盈利,我虽不甚了解,但这并未阻碍我采取行动。出于好奇与挑战自我的心态,我毅然决定利用Python来亲手实现一个类似的功能或平台。

一、用python抓取大乐透每天的开奖数据

代码示例:
使用requests和BeautifulSoup库抓取大乐透的开奖数据,并保存到CSV文件中。

import requests
from bs4 import BeautifulSoup
import csv

# 目标URL
url = 'http://datachart.500.com/dlt/history/newinc/history.php?start=07001&end=21018'

# 发送HTTP请求
response = requests.get(url)
response.encoding = 'utf-8'  # 确保编码正确

# 解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')

# 定位包含开奖数据的表格体
tbody = soup.find('tbody', id="tdata")

# 存储开奖数据的列表
lottery_data = []

# 遍历每一行数据
for tr in tbody.find_all('tr'):
    tds = tr.find_all('td')
    if tds:
        # 提取数据并添加到列表
        lottery_data.append([td.text for td in tds])

# 写入CSV文件
with open('dlt_lottery_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    # 写入标题行
    writer.writerow(['期号', '号码1', '号码2', '号码3', '号码4', '号码5', '号码6', '号码7'])
    # 写入数据行
    writer.writerows(lottery_data)

print('数据抓取完成,并保存到dlt_lottery_data.csv文件中。')

二、实时接口开发

传入大乐透号码,然后去所有期次中撞库
代码示例:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class LotteryController {

    private static final int RED_BALLS_COUNT = 5;
    private static final int BLUE_BALLS_COUNT = 2;

    @RequestMapping(value = "/lottery/dlt/query", method = RequestMethod.GET)
    public List<DltLotteryHistory> getDltLotteriesByList(
            @RequestParam(value = "blue") String blue,
            @RequestParam(value = "red") String red) {
        
        long startTime = System.currentTimeMillis();
        logger.info("Begin query with parameters: blue={}, red={}", blue, red);
        
        try {
            List<Integer> balls = parseAndSortBalls(red);
            List<Integer> blues = parseAndSortBalls(blue);
            
            DltLotteryHistory dltLotteryQO = createDltLotteryHistory(balls, blues);
            QueryWrapper<DltLotteryHistory> wrapper = new QueryWrapper<>(dltLotteryQO);
            List<DltLotteryHistory> dltLotteryHistories = dltLotteryHistoryService.list(wrapper);
            logger.info("Result size: {}", dltLotteryHistories.size());
            
            return dltLotteryHistories;
        } finally {
            String totalTime = DateUtils.getFriendlyTimeDiff(startTime, System.currentTimeMillis());
            logger.info("End query, total time: {}", totalTime);
        }
    }

    private List<Integer> parseAndSortBalls(String ballString) {
        return Arrays.stream(ballString.split(","))
                     .mapToInt(Integer::parseInt)
                     .sorted()
                     .boxed()
                     .collect(Collectors.toList());
    }

    private DltLotteryHistory createDltLotteryHistory(List<Integer> balls, List<Integer> blues) {
        DltLotteryHistory dltLotteryQO = new DltLotteryHistory();
        for (int i = 0; i < RED_BALLS_COUNT; i++) {
            dltLotteryQO.setRed(i + 1, balls.get(i));
        }
        for (int i = 0; i < BLUE_BALLS_COUNT; i++) {
            dltLotteryQO.setBlue(i + 1, blues.get(i));
        }
        return dltLotteryQO;
    }
}

总结

在收集了所有期次的彩票数据后,便可以深入进行数据分析和挖掘,从而开发出一系列创新且有趣的功能,为彩票爱好者提供更丰富的体验。
同时,鼓励大家积极参与支持中国公益彩票事业,这不仅是一种娱乐方式,也是对社会公益事业的贡献。祝愿每位参与者都能在享受游戏乐趣的同时,有机会赢得大奖,迈向财富自由的梦想之路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值