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
完全原创,代码全手工写的!
最后,希望能帮到正在看博客的你,文中有不当之处,希望能给我指正。我会修改的!
关注走一波!谢谢! 当然你要是觉得写的不错。可以打赏小弟哦!我会再接再厉的!