文章目录
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