爬取双色球历史中奖号码-简易的模拟买彩票

1 本文介绍

简要介绍

本文将从双色球往期中奖号码(点击跳转)爬取历年双色球中奖号码,然后创建文件存入当前目录。
再打开文件,随机抽取一期,再和你自己输入的双色球号码进行对比,显示中奖情况。

能学到什么

总的来说就是简易的模拟买彩票。本文这个代码也有很多问题,与现实不符,仅作参考。
在这里大概可以学到一些:

爬取网页内容
解析HTML/XML文件,提取其中的数据。
生成随机数,从往期中奖号码中随机选择一组号码。
添加延时,模拟耗时,显示进度条。
读取、写入CSV格式的文件,存储往期中奖号码。
将字符串按指定分隔符分割为列表,将列表使用指定分隔符连接成字符串。
根据中奖情况判断中奖金额。
封装获取往期中奖号码的函数,提高代码复用性。
通过input()函数获取用户输入,通过print()函数输出结果。

准备工作

首先要点击上面跳转到网页上,然后通过抓包工具找到特定数据的标签,通过什么方式请求这些信息,这里不细讲不然太多了,我这里的代码反正是已经做好了的,跟着看就可以。

2 导入库

提前下载好下面对应的库并进行导入。

import requests  # 导入requests模块,用于发送HTTP请求
from bs4 import BeautifulSoup  # 导入BeautifulSoup模块,用于解析HTML/XML
import random  # 导入random模块,用于生成随机数
import time  # 导入time模块,用于添加延时
from progressbar import ProgressBar  # 导入ProgressBar模块,用于显示进度条

3 读取存储文件内容的函数

定义一个函数进行读取存储双色球爬取结果的文件相关内容。
使用open函数读取指定文件的内容。
使用readlines读取每一行。
使用random库的choice函数随机选择一行数据。使用strip函数去除首位空格。使用split函数以逗号分隔,分割为列表。
分别使用切片提取期数,红球号码,蓝球号码,并返回。
[1:7]不包含7,因为是从0开始数,所以实际上是第2个到第7个数据。
[7]找到下标为7的,从0开始数,就是第8个数据。

def get_random():
    with open('./往期双色球中奖号码爬取1.csv', 'r', encoding='utf-8') as fp:
        lines = fp.readlines()
        line = random.choice(lines).strip().split(',')  # 随机选择一行数据,并去除首尾空格,按逗号分割为列表
        period = line[0]  # 提取期数
        red_balls = line[1:7]  # 提取红球号码,按空格分割为列表
        blue_ball = line[7]  # 提取蓝球号码
    return period, red_balls, blue_ball  # 返回期数、红球号码列表和蓝球号码

4 爬取网页内容

首先创建一个主程序入口,程序运行从这里开始。
指定网址和请求头并通过get函数向网页发起请求,并转换为字符串获取响应。

if __name__ == "__main__":
    # 爬取数据
    print('正在爬取往期彩票中奖号码...')
    url = "http://kaijiang.500.com/static/info/kaijiang/xml/ssq/list.xml"  # 目标网址
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36 Edg/117.0.2045.36'
        # 请求头,模拟浏览器访问
    }
    page_text = requests.get(url=url, headers=headers).text  # 发送HTTP请求,获取网页内容

5 解析网页内容

使用BeautifulSoup函数将响应内容解析为xml格式。
使用find_all函数提取所有名为row的标签赋给变量rows。

    # 解析XML文件
    soup = BeautifulSoup(page_text, 'xml')  # 使用BeautifulSoup解析网页内容xml
    rows = soup.find_all('row')  # 找到所有名为'row'的标签,这里是XML文件的行

6 存储内容

使用open函数再当前目录创建一个叫往期双色球中奖号码爬取1.csv的文件。
首先在文件中写入表头然后换行,内容从第二行开始。
使用for循环遍历每一个row标签。
从每一个row标签提取每一个期数和中将号码。也就是一期一期的提取出来。
将每一期的中奖号码以|为分隔,分出红球号码和蓝球号码,这取决于爬取的内容。
将每一期的内容一行一行的写入文件。

    # 提取数据并进行持久性存储
    with open('./往期双色球中奖号码爬取1.csv', 'w', encoding='utf-8') as fp:  # 打开文件,以写入模式写入内容
        fp.write("期数,红球中奖号码,蓝球中奖号码\n")  # 写入表头
        for row in rows:
            expect = row['expect']  # 获取行标签的'expect'属性,即期数
            opencode = row['opencode']  # 获取行标签的'opencode'属性,即中奖号码
            red_balls, blue_ball = opencode.split('|')  # 将中奖号码按竖线分割为红球号码和蓝球号码

            fp.write("{},{},{}\n".format(expect, red_balls, blue_ball))  # 将期数、红球号码、蓝球号码写入文件中

    print('爬取成功!已存入往期双色球中奖号码爬取1.csv中')

7 输入你的双色球号码

从键盘接收你输入的红球号码和蓝球号码。

    # 输入红球号码
    red_balls_input = input("请输入红球号码(1-33),以空格隔开: ").split()  # 用户输入红球号码,以空格分割为列表

    # 输入蓝球号码
    blue_ball_input = input("请输入蓝球号码(1-16): ")  # 用户输入蓝球号码

8 制造一个进度条(这里没啥用)

做一个进度条,本来是为美化,但是这个功能好像作用不大。

    # 从爬取结果中随机抽选一期中奖号码
    print('正在从爬取结果中随机抽选一期中奖号码...')
    progress = ProgressBar()  # 创建一个进度条对象
    for _ in progress(range(100)):  # 迭代100次,模拟进度条的进度
        time.sleep(0.1)  # 暂停0.01秒,模拟耗时操作

9 判断中奖情况

调用get_random函数接收返回的参数(期数,红球号码,蓝球号码)。
定义一个变量叫winning_amount用于表示中奖情况,就是你的号码和中奖号码有几个数字相同。
使用for循环遍历红球号码,一个一个号码的核对。
有一个号码对的上winning_amount就加1。
蓝球号码也进行对比是否相同。
蓝球号码相同winning_amount也加1。

    period, red_balls, blue_ball = get_random()  # 从爬取结果中随机选择一期中奖号码

    # 判断中奖情况及中奖金额
    winning_amount = 0  # 初始化中奖金额为0
    for ball in red_balls_input:  # 遍历用户选择的红球号码列表
        if ball in red_balls:  # 如果用户选择的红球号码在中奖红球号码列表中
            winning_amount += 1  # 中奖金额加1
    if blue_ball_input == blue_ball:  # 如果用户选择的蓝球号码与中奖蓝球号码一致
        winning_amount += 1  # 中奖金额加1

10 显示中奖情况

根据winning_amount的中奖情况显示相应中奖的文本内容。

    # 显示我的中奖情况及中奖金额
    print('中奖情况及中奖金额:', end="")
    if winning_amount == 7:  # 如果中奖金额为7(一等奖)
        print('恭喜你中了一等奖,中奖金额为1000万元!')
    elif winning_amount == 6:  # 如果中奖金额为6(二等奖)
        print('恭喜你中了二等奖,中奖金额为500万元!')
    elif winning_amount == 5:  # 如果中奖金额为5(三等奖)
        print('恭喜你中了三等奖,中奖金额为3000元!')
    elif winning_amount == 4:  # 如果中奖金额为4(四等奖)
        print('恭喜你中了四等奖,中奖金额为200元!')
    elif winning_amount == 3:  # 如果中奖金额为3(五等奖)
        print('恭喜你中了五等奖,中奖金额为10元!')
    else:  # 如果中奖金额为0、1、2(未中奖)
        print('很遗憾,你没有中奖。')

11 显示我的号码和中奖号码

最后显示我写的号码和抽取的中奖号码。

    # 显示我写的彩票号码和抽选的彩票的期数和中奖号码
    print('我写的彩票号码:')
    print("红球号码:", " ".join(red_balls_input))  # 将红球号码列表使用空格连接成字符串
    print("蓝球号码:", blue_ball_input)  # 输出用户选择的蓝球号码
    print('抽选的彩票的期数:', period)  # 输出抽选的彩票的期数
    print("中奖号码:")
    print("红球号码:", " ".join(red_balls))  # 将中奖红球号码列表使用空格连接成字符串
    print("蓝球号码:", blue_ball)  # 输出中奖蓝球号码

12 完整代码

import requests  # 导入requests模块,用于发送HTTP请求
from bs4 import BeautifulSoup  # 导入BeautifulSoup模块,用于解析HTML/XML
import random  # 导入random模块,用于生成随机数
import time  # 导入time模块,用于添加延时
from progressbar import ProgressBar  # 导入ProgressBar模块,用于显示进度条


def get_random():
    with open('./往期双色球中奖号码爬取1.csv', 'r', encoding='utf-8') as fp:
        lines = fp.readlines()
        line = random.choice(lines).strip().split(',')  # 随机选择一行数据,并去除首尾空格,按逗号分割为列表
        period = line[0]  # 提取期数
        red_balls = line[1:7]  # 提取红球号码,按空格分割为列表
        blue_ball = line[7]  # 提取蓝球号码
    return period, red_balls, blue_ball  # 返回期数、红球号码列表和蓝球号码

if __name__ == "__main__":
    # 爬取数据
    print('正在爬取往期彩票中奖号码...')
    url = "http://kaijiang.500.com/static/info/kaijiang/xml/ssq/list.xml"  # 目标网址
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36 Edg/117.0.2045.36'
        # 请求头,模拟浏览器访问
    }
    page_text = requests.get(url=url, headers=headers).text  # 发送HTTP请求,获取网页内容

    # 解析XML文件
    soup = BeautifulSoup(page_text, 'xml')  # 使用BeautifulSoup解析网页内容html5lib
    rows = soup.find_all('row')  # 找到所有名为'row'的标签,这里是XML文件的行

    # 提取数据并进行持久性存储
    with open('./往期双色球中奖号码爬取1.csv', 'w', encoding='utf-8') as fp:  # 打开文件,以写入模式写入内容
        fp.write("期数,红球中奖号码,蓝球中奖号码\n")  # 写入表头
        for row in rows:
            expect = row['expect']  # 获取行标签的'expect'属性,即期数
            opencode = row['opencode']  # 获取行标签的'opencode'属性,即中奖号码
            red_balls, blue_ball = opencode.split('|')  # 将中奖号码按竖线分割为红球号码和蓝球号码

            fp.write("{},{},{}\n".format(expect, red_balls, blue_ball))  # 将期数、红球号码、蓝球号码写入文件中

    print('爬取成功!已存入往期双色球中奖号码爬取1.csv中')

    # 输入红球号码
    red_balls_input = input("请输入红球号码(1-33),以空格隔开: ").split()  # 用户输入红球号码,以空格分割为列表

    # 输入蓝球号码
    blue_ball_input = input("请输入蓝球号码(1-16): ")  # 用户输入蓝球号码

    # 从爬取结果中随机抽选一期中奖号码
    print('正在从爬取结果中随机抽选一期中奖号码...')
    progress = ProgressBar()  # 创建一个进度条对象
    for _ in progress(range(200)):  # 迭代100次,模拟进度条的进度
        time.sleep(0.1)  # 暂停0.01秒,模拟耗时操作

    period, red_balls, blue_ball = get_random()  # 从爬取结果中随机选择一期中奖号码

    # 判断中奖情况及中奖金额
    winning_amount = 0  # 初始化中奖金额为0
    for ball in red_balls_input:  # 遍历用户选择的红球号码列表
        if ball in red_balls:  # 如果用户选择的红球号码在中奖红球号码列表中
            winning_amount += 1  # 中奖金额加1
    if blue_ball_input == blue_ball:  # 如果用户选择的蓝球号码与中奖蓝球号码一致
        winning_amount += 1  # 中奖金额加1

    # 显示我的中奖情况及中奖金额
    print('中奖情况及中奖金额:', end="")
    if winning_amount == 7:  # 如果中奖金额为7(一等奖)
        print('恭喜你中了一等奖,中奖金额为1000万元!')
    elif winning_amount == 6:  # 如果中奖金额为6(二等奖)
        print('恭喜你中了二等奖,中奖金额为500万元!')
    elif winning_amount == 5:  # 如果中奖金额为5(三等奖)
        print('恭喜你中了三等奖,中奖金额为3000元!')
    elif winning_amount == 4:  # 如果中奖金额为4(四等奖)
        print('恭喜你中了四等奖,中奖金额为200元!')
    elif winning_amount == 3:  # 如果中奖金额为3(五等奖)
        print('恭喜你中了五等奖,中奖金额为10元!')
    else:  # 如果中奖金额为0、1、2(未中奖)
        print('很遗憾,你没有中奖。')

    # 显示我写的彩票号码和抽选的彩票的期数和中奖号码
    print('我写的彩票号码:')
    print("红球号码:", " ".join(red_balls_input))  # 将红球号码列表使用空格连接成字符串
    print("蓝球号码:", blue_ball_input)  # 输出用户选择的蓝球号码
    print('抽选的彩票的期数:', period)  # 输出抽选的彩票的期数
    print("中奖号码:")
    print("红球号码:", " ".join(red_balls))  # 将中奖红球号码列表使用空格连接成字符串
    print("蓝球号码:", blue_ball)  # 输出中奖蓝球号码

运行结果:

正在爬取往期彩票中奖号码...
爬取成功!已存入往期双色球中奖号码爬取1.csv中
请输入红球号码(1-33),以空格隔开: 1 2 3 4 5 6
请输入蓝球号码(1-16: 1 
正在从爬取结果中随机抽选一期中奖号码...
100% |########################################################################|
中奖情况及中奖金额:很遗憾,你没有中奖。
我写的彩票号码:
红球号码: 1 2 3 4 5 6
蓝球号码: 1 
抽选的彩票的期数: 09118
中奖号码:
红球号码: 12 16 25 26 27 31
蓝球号码: 05
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值