如何使用 Python 实现彩票自由(大乐透)

共 1134字,需浏览 3分钟

 ·

2022-03-16 08:49

大家好,我是安果!


全国有很多彩民,其中购买最多的彩种分别是体彩大乐透和福彩双色球;虽然中大奖的概率极低,但是彩民纷至沓来,一方面抱着一份中奖的希望,另一方面想为公益事业贡献自己的一份薄力
我一直都有购买彩票的习惯,之前路过彩票店都会让店老板机选几注,这样选号自定义没那么方便,而且没法实现连续购买的需求

本篇文章将介绍 Python 实现彩票自由的全流程

1. 随机一注

体彩大乐透一注包含 7 个数字,包含 5 个红球和 2 个篮球

其中

  • 红球是从 1 - 35 中选择 5 个不同的数字

  • 蓝球是从 1 - 12 中选择 2 个不同的数字

使用 Python 随机生成一注号码部分代码如下:

def gene_dlt(number):
    """
    随机多注大乐透
    :param number:
    :return:
    """

    result = []

    for index in range(number):
        # 产生5个红球
        red = random.sample([i for i in range(136)], 5)
        # 产生2个蓝球
        blue = random.sample([i for i in range(113)], 2)

        # 排序
        red.sort()
        blue.sort()

        # 数据处理
        red = nums_pre(red)
        blue = nums_pre(blue)

        result.append(' '.join(red) + " + " + ' '.join(blue))
    return '\n'.join(result)

需要注意的是,为了方便后面判断是否中奖,这里进行了一次数据预处理,将小于 10 的数字前面加上 0

def nums_pre(nums):
    """
    购买数字预处理,如果是个位数,加上0
    :param nums:
    :return:
    """

    if nums:
        if isinstance(nums, list) or isinstance(nums,tuple):
            return ['0{}'.format(int(item)) if int(item) < 10 else str(int(item)) for item in nums]
        else:
            return '0{}'.format(int(nums)) if int(nums) < 10 else str(int(nums))
    else:
        return ''

2. 红球固定或蓝球固定

很多彩民认为中奖号码没有规律,因此会选择根据自己的幸运数字,组成一注号码进行固定购买

2-1  红球固定

红球固定的情况下,我们只需要随机生成蓝球,然后进行排序、数据预处理,最后组成一注号码即可

def gene_blue_random_dlt(red, number):
    """
    红球固定,篮球随机
    :param red:红球
    :param number:随机注数
    :return:
    """

    result = []

    for index in range(number):
        # 产生2个蓝球
        blue = random.sample([i for i in range(113)], 2)

        # 排序
        red.sort()
        blue.sort()

        # 数据处理
        red = nums_pre(red)
        blue = nums_pre(blue)

        result.append(' '.join(red) + " + " + ' '.join(blue))
    return '\n'.join(result)

2-2  蓝球固定

蓝球固定时,我们只需要从 1-35 中随机生成 5 个不同的数字即可

def gene_red_random_dlt(blue, number):
    """
    5个红球随机,2个篮球固定
    :param blue:蓝球列表
    :param number:随机注数
    :return:
    """

    result = []

    for index in range(number):
        # 产生5个红球
        red = random.sample([i for i in range(136)], 5)

        # 排序
        red.sort()
        blue.sort()

        # 数据处理
        red = nums_pre(red)
        blue = nums_pre(blue)

        result.append(' '.join(red) + " + " + ' '.join(blue))
    return '\n'.join(result)

3. 爬取中奖号码

体彩大乐透开奖时间一般是晚上 9 点到 10 点之间,这里建议选择晚上 10 点半进行爬虫,保证爬取数据的稳定准确性

目标地址:

aHR0cHM6Ly9rYWlqaWFuZy41MDAuY29tL3N0YXRpYy9pbmZvL2thaWppYW5nL3htbC9kbHQvbGlzdC54bWw=

该网站通过 XML 数据展示了每一期大乐透的中奖号码,我们只需要使用正则表达式匹配出所有中奖号码,取最近的一期号码即可

import re
import requests

class DLT(object):

    def __init__(self):
        # 自行去转码获取(公众号:煎蛋搞钱)
        self.url = '**'
        self.headers = {
            'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
        }

    def get_last_dlt_lucky(self):
        # 发起请求
        reponse = requests.get(url=self.url, headers=self.headers)

        # 正则规则
        pattern = re.compile(r')

        # 大乐透数据
        dlt_raw_list = pattern.findall(reponse.text)

        results = []

        for item in dlt_raw_list:
            # 期数、数据、时间
            no, info, create_at = item
            # 5个红球、2个篮球
            red, blue = info.split("|")

            red_datas = red.split(",")
            blue_datas = blue.split(",")

            results.append(
                [no, red_datas[0], red_datas[1], red_datas[2], red_datas[3], red_datas[4], blue_datas[0], blue_datas[1],
                 create_at]
            )

        # 最近的一期中奖号码
        last_lottery = results[0]

        return [last_lottery[1], last_lottery[2], last_lottery[3], last_lottery[4], last_lottery[5]], \
               [last_lottery[6], last_lottery[7]]

# 4. 是否中奖

有了购买号码、中奖号码,我们查看体彩大乐透官网中奖规则,根据红球中奖个数、蓝球中奖个数返回中奖信息即可

实现代码如下:

...

def judge_dlt_lucky(red_nums_result, red_nums_buy, blue_nums_result, blue_nums_buy):
    """
    根据中奖号码及购买号码,返回对应的中奖信息
    :param red_nums_result:
    :param red_nums_buy:
    :param blue_num_result:
    :param blue_num_buy:
    :return:
    """

    # 红球预测的数目
    red_lucky_count = 0
    # 篮球预测的数目
    blue_lucky_count = 0

    # 数据预处理
    red_nums_buy = nums_pre(red_nums_buy)
    blue_nums_buy = nums_pre(blue_nums_buy)

    # 判断红球
    for red_result_item in red_nums_result:
        for red_buy_item in red_nums_buy:
            if red_result_item == red_buy_item:
                red_lucky_count += 1

    # 判断蓝球
    for blue_result_item in blue_nums_result:
        for blue_buy_item in blue_nums_buy:
            if blue_result_item == blue_buy_item:
                blue_lucky_count += 1

    # 大乐透中奖规则
    if red_lucky_count == 5 and blue_lucky_count == 2:
        luck_level = 1  # 一等奖(5+2)
    elif red_lucky_count == 5 and blue_lucky_count == 1:
        luck_level = 2  # 二等奖(5+1)
    elif red_lucky_count == 5 and blue_lucky_count == 0:
        luck_level = 3  # 三等奖(5+0)
    elif red_lucky_count == 4 and blue_lucky_count == 2:
        luck_level = 4  # 四等奖(4+2)
    elif red_lucky_count == 4 and blue_lucky_count == 1:
        luck_level = 5  # 五等奖(4+1)
    elif red_lucky_count == 3 and blue_lucky_count == 2:
        luck_level = 6  # 六等奖(3+2)
    elif red_lucky_count == 4 and blue_lucky_count == 0:
        luck_level = 7  # 七等奖(4+0)
    elif red_lucky_count == 3 and blue_lucky_count == 1:
        luck_level = 8  # 八等奖(3+1)
    elif red_lucky_count == 2 and blue_lucky_count == 2:
        luck_level = 8  # 八等奖(2+2)
    elif red_lucky_count == 3 and blue_lucky_count == 0:
        luck_level = 9  # 九等奖(3+0)
    elif red_lucky_count == 2 and blue_lucky_count == 1:
        luck_level = 9  # 九等奖(2+1)
    elif red_lucky_count == 1 and blue_lucky_count == 2:
        luck_level = 9  # 九等奖(1+2)
    elif red_lucky_count == 0 and blue_lucky_count == 2:
        luck_level = 9  # 九等奖(0+2)
    else:
        luck_level = -1

    return get_lucky_desc(luck_level),luck_level

# 5. 总结一下

通过上面的几个步骤,我们实现了选号、爬取中奖号码、判断是否中奖等功能

关于如何将选择的号码发送给站点老板,大家可以通过企业微信、UI 自动化、PC Hook 等方式来完成

我已将文中所有源码上传到下方公众号后台,关注公众号后回复关键字dlt 」即可以获取

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报