Bootstrap

Python数据化分析——之爬取福利彩票数据

Python在生活中可以大大提高我们的工作效率,可用于数据分析(matplotlib,Pygal),爬虫(requests库)等,今天我们的主题是 利用 requests 库和 Pygal 模块爬取福利彩票的数据,并做数据分析!本人小白,感谢各位大神纠正错误

本次需要用到的库主要有: requests(爬虫)、Pygal(数据分析,做图表),json(数据处理)等

思路:

1、找目标(需要爬取那个网站的信息)

2、获取 API 接口 url,并分析 URL 

3、根据此 URL ,模拟发送请求,获取响应

4、分析数据(此处为 JSON 格式)

5、处理数据(数据化分析,做出图表)

6、代码优化


 

1、通过百度搜索  “大乐透” 会出现很多相关词条

                                                                     

2、通过 fiddler 工具分析可知,该接口地址

url = " https://webapi.sporttery.cn/gateway/lottery/getHistoryPageListV1.qry?gameNo=85&provinceId=0&pageSize=30&isVerify=1&pageNo=1"

                                                         

分析 API 接口地址 发现 pageNo=1 是页码,因此我们可以获取多页数据。

想法:通过拼接 url ,来循环处理每一页   pageSize=30&isVerify=1&pageNo=i  (i = 1,2,3,4,5,……n)

至此,我们完成了第一步! 获取了 API 的接口地址,我们可以用 Python,模拟发送请求,从而获取数据

3、根据此 URL ,模拟发送请求,获取响应

代码:

import requests
import ssl

# API 地址的一部分
addr = "https://webapi.sporttery.cn/gateway/lottery/getHistoryPageListV1.qry?gameNo=85&provinceId=0&pageSize=30&isVerify=1&pageNo="

# 存储大乐透 API 的接口地址
SuperLotto = []

# 拼接 URL,获取 50页数据, page 返回一个列表,列表的值是 [1,2,3,4,……,49,50]
page = [i for i in range(1,51)]  # page=[1,2,3,4,……,49,50]
for i in page: # i 循环从列表 page中取数据 ,因为列表的下标是从 0 开始 , i = 1
    url = addr + str(page[i-1])  # 所以 str(page[i-1]) => page[0]  => 1
    SuperLotto.append(url) # 得出 url 就是第一页的数据,依次类推, 50页数据

# 构造请求信息,我们将以此身份信息去访问该网站
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
    "Host": "webapi.sporttery.cn",
    "Connection": "keep-alive",
}
# 打印 URL ,看看是否符合预期
print(SuperLotto)
# 因为是 https 协议,所以需要设置此 ssl 
gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)

# 循环处理每一条 URL 
for url in SuperLotto:
    #  发送get 请求,将请求返回保存在 response 对象
    response_obj = requests.get(url,headers = headers)
    # 循环处理每一个 请求
    response = response_obj.text
    print(response_obj.status_code)

###########################################################################

# 先执行上面的代码,我们发现返回的是 200



 输出结果:

 

 返回的状态码是 200, 表示我们成功访问了! 现在就是取数据,我们先

4、分析数据

我们需要获取的数据有:

开奖时间:  lotterySaleEndtime
开奖期数:  lotteryDrawNum
开奖号码:  lotteryUnsortDrawresult
一等奖人数:stakeCount
for url in SuperLotto:
    #  发送get 请求,将请求返回保存在 response 对象
    response_obj = requests.get(url,headers = headers)
    #循环处理每一个 请求
    response = response_obj.text
    # 将 获取的数据转换成 JSON 数据
    response_json = json.loads(response )
    # 打印获取的信息,返回的是一个字典类型数据 dict
    print(response_json)

根据分析的数据,我们可以获取想要的信息。 response_json["value"]["list"][i]["lotterySaleEndtime"]   获取开奖时间

# 此处接上面的代码
# 将相应数据存储到列表中
lotteryUnsortDrawresults, lotterySaleEndtimes = [], []

#循环处理每一个 请求,response_obj.text 可以获取当前页面的数据
    response = response_obj.text
    # 将 获取的数据转换成 JSON 数据
    response_json = json.loads(response )
    # 获取 本页期数的长度
    page_len = len(response_json['value']["list"])  # page_len = 30
    # 循环取每一条数据
    for i in range(page_len):       # i = 0,1,2,……,29
        lotteryDrawNum = response_json['value']["list"][i]["lotteryDrawNum"]
        lotterySaleEndtime = response_json['value']["list"][i]["lotterySaleEndtime"].split(" ")[0]   
        lotterySaleEndtimes.append(lotterySaleEndtime)  
        lotteryUnsortDrawresult = response_json['value']["list"][i]["lotteryUnsortDrawresult"]
        lotteryUnsortDrawresults.append(lotteryUnsortDrawresult)
        stakeCount = str(response_json['value']["list"][i]["prizeLevelList"][0]["stakeCount"])
        print("期数:%s ,时间:%s,开奖号码:%s,一等奖人数: %s" % (lotteryDrawNum, lotterySaleEndtime, lotteryUnsortDrawresult,stakeCount))

以上代码返回的结果:

至此,你想要获取什么信息,都可以获取到!通过字典键值对的方式可以获取  

5、处理数据(数据化分析,做出图表)

# 可视化操作
"""
分析:
我们现在有了数据:
开奖时间:lotterySaleEndtime
开奖期数:lotteryDrawNum
开奖号码:lotteryUnsortDrawresult
一等奖人数:stakeCount
X 轴: 开奖时间
Y 轴: 开奖号码总和
"""
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS

############################  处理数据  ########################################

new_red_ball,new_blue_ball = [], []
# 存储总数的列表
lotteryUnsortDrawresultsNum = []
# 求每期的和  09+35+27+17+28 03+08
for value in lotteryUnsortDrawresults:
    new_value = value.split(" ")
    red_ball = new_value[0].split("+")   
    for n in red_ball:
        try:
            new_red_ball.append(int(n))
        except ValueError as e:
            pass
        else:
            blue_ball = new_value[1].split("+")
    for n in blue_ball:
        new_blue_ball.append(int(n) )
    print("红球号码是: %s, 绿球号码是: %s"%(new_red_ball,new_blue_ball))

#################################################################################

my_style = LS("#336699",base_style= LCS)
# 实例化对象,创建一个条形图的实例
chart = pygal.Bar(style = my_style, x_label_rotation = 45, show_legend = False)
# 设置图的标题
chart.title = " SuperLotto Number Of Sum "
# 设置X 轴的标签
chart.x_labels = lotterySaleEndtimes
# 添加数据
chart.add("",lotteryUnsortDrawresultsNum)
# 保存图片,以 svg 格式保存,可以用 浏览器打开
chart.render_to_file("Bar_SuperLotto.svg")














结果输出

查看图片,当数据少的时候,图片效果较佳!pygal 还有很多操作,后续补上!

至此,大部分事情已完成,我们提取了大乐透的相关数据,并进行的可视化分析。你可以自己设置坐标轴。传递不同的参数。

我还将大乐透近 10年的数据全部提取出来,放在 txt 文档中,也可以做出 excl 表格的形式会更直观!后续补齐!

6、代码优化

我们可以用类的方法来实现。各个功能模块可以用函数实现! 这样代码看起来会更加简洁明了。交给你了,加油   __Stranger

 

完全原创,代码全手工写的!

最后,希望能帮到正在看博客的你,文中有不当之处,希望能给我指正。我会修改的! 

关注走一波!谢谢! 当然你要是觉得写的不错。可以打赏小弟哦!我会再接再厉的!

                                                                      

 

 

 

 

 

;