【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析

news2024/11/15 19:36:13

文章目录

  • 前言
    • 导入库![在这里插入图片描述](https://img-blog.csdnimg.cn/05ab496a2ac045e6ad0b175292462fac.png)
    • 发送请求给指定网址
    • 伪装自己
    • 发送请求并获取响应
    • 设置编码
    • 解析HTML并获取结果
    • 创建CSV文件并写入数据
    • 打印输出结果
    • 加载自定义字体
    • 绘制折线图
    • 完整代码
  • 结束语

在这里插入图片描述

前言

本文介绍了如何使用Python编程语言获取双色球历史数据,并使用数据可视化工具Matplotlib绘制了红球数量的折线图。通过对双色球历史数据的分析,我们可以更好地了解双色球的开奖规律和趋势。

导入库在这里插入图片描述

import requests
from lxml import etree
import csv
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

这部分代码导入了需要使用的库。requests库用于发送网络请求,lxml库用于解析HTML,csv库用于处理CSV文件,matplotlib.pyplot库用于绘制图表,matplotlib.font_manager.FontProperties库用于加载自定义字体。

发送请求给指定网址

在这里插入图片描述

url = 'https://datachart.500.com/ssq/'

在这段代码中,将指定的网址赋值给变量url,该网址是获取双色球历史数据的网站。

伪装自己

在这里插入图片描述

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}

这里通过设置headers字典来模拟浏览器的请求头,其中User-Agent字段指定了伪装的浏览器信息。

发送请求并获取响应

在这里插入图片描述

resp = requests.get(url, headers=headers)

使用requests.get()方法发送GET请求,并将响应结果赋值给变量resp

设置编码

resp.encoding = 'gbk'

这里将响应的编码方式设为gbk,以确保正确解析网页内容。

解析HTML并获取结果

在这里插入图片描述

e = etree.HTML(resp.text)
reds = [tr.xpath('./td[contains(@class,"chartBall01")]/text()') for tr in e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]')]
blues = e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]/td[contains(@class,"chartBall02")]/text()')

使用etree.HTML()方法对响应的文本进行解析,并通过XPath表达式提取出红球和篮球的数据。

  • 对于红球的提取,首先通过e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]')获取到所有包含红球号码的行元素;然后在每行元素基础上,使用tr.xpath('./td[contains(@class,"chartBall01")]/text()')提取红球的文本内容。最终将所有红球号码保存在reds列表中。

  • 对于篮球的提取,通过e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]/td[contains(@class,"chartBall02")]/text()')直接提取所有篮球号码的文本内容,保存在blues列表中。

创建CSV文件并写入数据

with open('history.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['红球', '篮球'])  # 写入表头
    for r, b in zip(reds, blues):
        writer.writerow([r, b])  # 写入数据

使用open()函数创建一个名为history.csv的CSV文件,并以写入的模式打开。然后使用csv.writer()创建一个writer对象,将红球和篮球的数据写入CSV文件。

  • with open('history.csv', 'w', newline='') as csvfile::打开文件history.csv,使用'w'模式表示写入,newline=''表示写入的行与行之间没有额外的空行。

  • writer = csv.writer(csvfile):创建一个writer对象,用于写入CSV文件。

  • writer.writerow(['红球', '篮球']):写入表头,即CSV文件的第一行数据。

  • for r, b in zip(reds, blues)::使用zip()函数将红球和篮球的数据进行配对。

  • writer.writerow([r, b]):将每一期的红球和篮球号码写入CSV文件。

打印输出结果

print("数据保存成功!")

简单地打印出"数据保存成功!"的提示信息。

加载自定义字体

font_path = '../caisemenghuanjingyu.ttf'
custom_font = FontProperties(fname=font_path)

指定自定义字体文件的路径,并使用FontProperties()函数创建一个custom_font对象,以便在图表中使用自定义字体。

绘制折线图

red_counts = [len(r) for r in reds]
blue_counts = len(blues)

plt.plot(red_counts, color='red', label='红球'  )
plt.axhline(y=blue_counts, color='blue', linestyle='--', label='篮球' )

# 设置使用自定义字体
plt.xlabel('期数', fontproperties=custom_font)
plt.ylabel('数量', fontproperties=custom_font)
plt.title('双色球历史数据', fontproperties=custom_font)

plt.legend( )
plt.show()

使用plt.plot()方法绘制红球的折线图,将red_counts作为纵坐标的数据,设置线条颜色为红色,并指定标签为"红球"。

使用plt.axhline()方法绘制一条水平虚线,表示篮球的数量,将blue_counts作为水平线的位置,设置线条颜色为蓝色,并指定标签为"篮球"。

然后,通过plt.xlabel()plt.ylabel()方法设定横纵坐标的标签文本,并通过plt.title()方法设定图表的标题。

最后,使用plt.legend()方法显示图例,以及plt.show()方法展示绘制的图表。

完整代码

import requests  # 导入requests库,用于发送HTTP请求
from lxml import etree  # 导入lxml库,用于解析HTML
import csv  # 导入csv库,用于操作CSV文件
import matplotlib.pyplot as plt  # 导入matplotlib库,用于绘图
from matplotlib.font_manager import FontProperties  # 导入FontProperties类,用于设置字体

url = 'https://datachart.500.com/ssq/'  # 设置目标网址

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}
# 设置请求头信息,伪装成浏览器发送请求

resp = requests.get(url, headers=headers)  # 发送HTTP GET请求,获取响应

resp.encoding ='gbk'  # 设置响应的编码格式为gbk

e = etree.HTML(resp.text)  # 将响应的内容解析为HTML对象

reds = [tr.xpath('./td[contains(@class,"chartBall01")]/text()') for tr in e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]')]
# 从HTML对象中提取红球数据,使用XPath路径进行定位并提取文本内容,并将结果保存到reds列表中

blues = e.xpath('//tbody[@id="tdata"]/tr[not(contains(@class,"tdbck"))]/td[contains(@class,"chartBall02")]/text()')
# 从HTML对象中提取蓝球数据,使用XPath路径进行定位并提取文本内容,并将结果保存到blues列表中

with open('history.csv', 'w', newline='') as csvfile:
    # 打开名为history.csv的文件,如果文件不存在,则新建一个
    writer = csv.writer(csvfile)
    # 创建一个csv写入对象
    writer.writerow(['红球', '篮球'])
    # 写入表头 ['红球', '篮球']
    for r, b in zip(reds, blues):
        # 使用zip函数同时遍历reds和blues两个列表
        # 将红球和蓝球配对,并按行写入CSV文件中
        writer.writerow([r, b])

print("数据保存成功!")  # 输出保存成功的提示信息

font_path = '../caisemenghuanjingyu.ttf'  # 设置自定义字体文件的路径
custom_font = FontProperties(fname=font_path)  # 创建自定义字体对象

red_counts = [len(r) for r in reds]  # 计算每期红球数量,并保存到red_counts列表中
blue_counts = len(blues)  # 计算篮球数量

plt.plot(red_counts, color='red', label='红球')  # 绘制红球数量折线图,设置线条颜色为红色,添加标签"红球"
plt.axhline(y=blue_counts, color='blue', linestyle='--', label='篮球')  # 绘制横线,表示篮球数量,设置线条颜色为蓝色,虚线样式,添加标签"篮球"

plt.xlabel('期数', fontproperties=custom_font)  # 设置横坐标标签为"期数",使用自定义字体
plt.ylabel('数量', fontproperties=custom_font)  # 设置纵坐标标签为"数量",使用自定义字体
plt.title('双色球历史数据', fontproperties=custom_font)  # 设置图表标题为"双色球历史数据",使用自定义字体

plt.legend()  # 显示图例
plt.show()  # 显示图表

##运行效果截图

在这里插入图片描述

结束语

通过本文的学习,我们了解到了如何利用Python编程语言来获取网页数据、解析HTML内容,并将数据存储到CSV文件中。同时,我们还学会了使用Matplotlib库进行数据可视化,通过绘制折线图来展示红球数量的变化趋势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/811559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(学习笔记)matplotlib.pyplot模块下基本画图函数的整理

matplotlib版本:3.7.1 python版本:3.10.12 基本函数 matplotlib版本:3.7.1python版本:3.10.12 1. plt.plot()函数1.1 plt.plot(x, y)1.2 plt.plot(x, y, **kwargs) 2. plt.xlable(), plt.ylable()3. plt.title()4. plt.show()5.p…

Pytorch(二)

一、分类任务 构建分类网络模型 必须继承nn.Module且在其构造函数中需调用nn.Module的构造函数无需写反向传播函数,nn.Module能够利用autograd自动实现反向传播Module中的可学习参数可以通过named_parameters()返回迭代器 from torch import nn import torch.nn.f…

如何注册Ddns域名?用快解析新手也可以轻松搞定!

对于每一个上网的朋友来说,如果平时经常需要访问外网,就需要用到Ddns域名了,不过这个域名的注册比较麻烦,也没有那么容易,因此很多朋友对此也有很多的疑惑。那么,Ddns域名注册怎么操作呢?其实利…

直流电机的系统辨识——LZW

前言 本文采用基于最小二乘的线性辨识方法和基于Nonlinear ARX模型的非线性辨识方法对图1所示的直流电机进行系统辨识,并分别设计H∞控制器,分析比较控制效果。 图1 实验器材 目录 前言一、数据采集二、系统辨识1.最小二乘法(线性辨识&#…

认识自动化测试

目录 简述 手动测试 自动化测试 测试类型 单元测试 集成测试 端到端测试(E2E) 快照测试 测试覆盖率 代码覆盖率 需求覆盖率 总结 自动化测试有以下几个概念: 单元测试集成测试E2E 测试快照测试测试覆盖率TDD 以及 BDD 等 简述 …

【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多,新手可以看下 《【MQTT】Esp32数据上传采集:最新mqtt插件(支…

GAMES101 笔记 Lecture13 光线追踪1

目录 Why Ray Tracing?(为什么需要光线追踪?)Basic Ray Tracing Algorithm(基础的光线追踪算法)Ray Casting(光线的投射)Generating Eye Rays(生成Eye Rays) Recursive(Whitted-Styled) Ray Tracing Ray-Surface Intersection(光线和平面的交点)Ray Rquation(射线方…

盘点:查快递教程

在“寄快递”成为常态的当下,如何快速进行物流信息查询,是收寄人所关心的问题。在回答这个问题之前,首先我们要知道,物流信息查询,有哪些方法? 1、官网单号查询 知道物流公司和单号的情况下,直…

管理类联考——写作——论说文——实战篇——标题篇

角度3——4种材料类型、4个立意对象、5种写作态度 经过审题立意后,我们要根据我们的立意,确定一个主题,这个主题必须通过文章的标题直接表达出来。 标题的基本要求 主题清晰,态度明确 第一,阅卷人看到一篇论说文的标…

【动态规划part13】| 300.最长递增子序列、674.最长连续递增序列、718.最长重复数组

目录 🎈LeetCode 300.最长递增子序列 🎈LeetCode 674. 最长连续递增序列 🎈LeetCode 718. 最长重复子数组 🎈LeetCode 300.最长递增子序列 链接:300.最长递增子序列 给你一个整数数组 nums ,找到其…

camund——2、cancelActivityInstance()与多实例下getActiveActivityIds()获取不到当前任务的节点。

在多实例(会签或者并行网关)时如果使用以下代码来进行驳回时,使用 **List activeActivityIds runtimeService.getActiveActivityIds(instanceId);**来获取当前活动的节点会出现获取不到情况。 runtimeService.createProcessInstanceModific…

基于Linux操作系统中的MySQL用户权限管理(三十二)

用户权限管理 目录 一、概述 二、用户权限类型 1、ALL PRIVILEGES 2、CREATE 3、DROP 4、SELECT 5、INSERT 6、UPDATE 7、DELETE 8、INDEX 9、ALTER 10、CREATE VIEW和CREATE ROUTINE 11、SHUTDOWN 12、GRANT OPTION 三、用户赋权 四、权限删除 五、用户删除 …

RTThread实际开发问题统计

文章目录 开启DMA rx中断,数据帧总是接收不全就产生中断?PB3/PB4等和JTAG复用的管脚不能使用?uart使用DMA传输,调用close再open之后就接收不到数据了? 开启DMA rx中断,数据帧总是接收不全就产生中断&#x…

C语言指针应该这么学?

数组名的意义: 1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。 2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 3. 除此之外所有的数组名都表示首元素的地址。 根据以上数…

[CrackMe]Cruehead.1.exe的逆向及注册机编写

1. 逆向分析过程 作者弄了很多个对话框来迷惑破解者, 然后真正有用的对话框只有这个 这个窗口过程函数处理的是父窗口 其他的不关心, 只关心WM_COMMAND消息 里面有3个分支, 其中最重要的是按下register按钮的那个 整个逻辑非常清晰, 其算法是把name的每个字符转成大写字母…

测试测试用例设计常见面试题

测试|测试用例设计常见面试题 文章目录 测试|测试用例设计常见面试题1.怎么模拟弱网(测试技巧)2.怎么测试接口(测试技巧)3.怎么对冒泡排序测试(代码类)4.怎么对linux的zip命令进行测试(软件类&a…

Spring Boot项目的创建

hi 大家好,又见面了,今天继续讲解Spring Boot 文章目录 🐶1.什么是Spring Boot?🐶2.Spring Boot的优势🐶3.Spring Boot项目创建🌼3.1使用ieda创建🥝3.1.1下载插件Spring Boot Helper🥝3.1.2创建项目 &…

基于ThreadPoolExecutor实现动态线程池

项目上,我们是根据业务的使用频率,基于ThreadPoolExecutor自定义一个线程池,线程池的核心线程数、最大线程数、阻塞队列的容量都是估计的设置的,但是不知道线程资源的真正使用情况。 1.ThreadPoolExecutor配置参数动态修改 先来…

Linux Day04

目录 一、文件压缩与解压命令 1.1 tar cvf 文件名 ---打包命令生成.tar 1.2 tar xvf 文件名 ----解开包 生成文件 1.3 gzip .tar 压缩 生成.tar.gz压缩包 1.4 gzip -d .tar.gz 解压成包 1.5 直接把压缩包解压成文件 tar zxf .tar.gz 二、Linux 系统上 C 程序的…

Python实现自动登录和下单脚本,代码嘚魅力~

目录标题 前言环境使用:代码实现思路配置浏览器驱动代码实现尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI(用户界面)自动化测试套件之一。 Selenium 支持的语言包括C#…