python爬虫——对于500彩票网站的数据爬取以及数据可视化

一.选题的背景

据统计今年四月以来,全国彩票销量突破1700亿元,达到1751.50亿元,和2020年、2021年相比涨幅更大,比2019年也高出300多亿。

而且买彩票的年轻人也越来越多,首先现在是自媒体时代,体彩、福彩在媒体上的宣传,年轻人无疑是最大的受众体,而年前人接受新事物的能力比较强,“小小彩票也能成就梦想”这样的口号也渐渐被年轻人接纳。

我也是年轻人的一员,所以我选择对于500彩票网站的超级大乐透的近100期进行爬取,看那些号码适合购买,来完成我的"一夜暴富梦"。

二.主题式网络爬虫设计方案

 

1.主题式网络爬虫名称

500彩票超级大乐透近100期页面爬取

2.主题式网络爬虫爬取的内容与数据特征分析

500彩票超级大乐透近100期页面爬取主要爬取了页面中表格table中的td数据。

为页面中的期号、前区号码1-5、后区、奖池奖金、一等奖注数、一等奖奖金、二等奖注数、二等奖奖金、总投注额(元)、以及开奖日期。

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

思路:

  1. 定义主题:首先确定你要爬取的主题或领域,例如新闻、论坛、电影等。明确你想要获取的数据类型和目标网站。

  2. 网站选择:根据你的主题选择目标网站,并分析网站的结构和内容。了解网站的页面布局、数据存储方式和数据获取方式。

  3. URL生成:根据目标网站的URL规律和数据分页方式,生成需要爬取的URL列表。可以通过构造URL参数、拼接URL路径等方式来生成URL。

  4. 数据抽取:访问每个URL,并从页面中抽取所需的数据。使用合适的爬虫库(如Scrapy、BeautifulSoup等)来解析页面、定位HTML元素,并提取数据。

  5. 数据存储:将抽取的数据存储到适合的数据存储介质中,如数据库、文件等。可以使用数据库(如MySQL、MongoDB)来存储结构化数据,或使用文件(如CSV、JSON)来存储非结构化数据。

  6. 增量爬取:为了保持数据的最新性,可以实现增量爬取功能。记录已爬取的URL或数据的标识,并定期更新已有数据或新增数据。

难点:

  1. 网站结构分析:需要深入了解目标网站的结构和页面布局,以便正确定位和提取所需的数据。这可能涉及到HTML解析、CSS选择器、XPath等技术。

  2. 反爬虫机制:目标网站可能采取各种反爬虫机制,如验证码、IP封禁、请求限制等。需要应对这些机制,如使用代理IP、伪造请求头、处理验证码等。

  3. 数据清洗和处理:从网页中抽取的数据可能存在格式不一致、缺失值或异常数据,需要进行数据清洗和处理的步骤,以确保数据的准确性和一致性。

三、主题页面的结构特征分析

1.主题页面的结构与特征分析

目标内容界面:

 

2.Htmls 页面解析

 

3.节点(标签)查找方法与遍历方法

打开网页的源码,然后用鼠标检查工具找打对应大概位置进行查找,然后在元素中分析,用beautifulsoup4方法对获取的页面进行处理

 

四、网络爬虫程序设计

1.数据爬取与采集

 以下为爬取过程代码

复制代码
 1 import requests
 2 from bs4 import BeautifulSoup
 3 #导入前两个库为爬虫所需要的库
 4 
 5 import pandas as pd
 6 #导入后面将数据转化格式的库
 7 
 8 from retry.api import retry_call
 9 
10 url = "https://datachart.500.com/dlt/history/newinc/history.php?limit=100&sort=0"
11 #所需要访问的网页为https://datachart.500.com/dlt/history/history.shtml
12 #(500)彩票网址 因为要查询的为100期的但 所以在检查里面寻找网络 将30期切换为100期
13 #出现了名称为history.php?limit=100&sort=0的文件 在表头的常规里面找到url即为所需的100期
14 
15 response = requests.get(url)
16 if response.status_code==200:
17     print("请求成功")
18 # 发送GET请求获取页面内容 若请求成功则继续 否则输出请求失败
19 
20 
21     soup = BeautifulSoup(response.content, 'html.parser')
22     # 使用BeautifulSoup解析页面内容 并用'html.parser'的方法解析
23     #在页面的检查界面的元素找到需要的表格信息的html所在地
24 
25     table = soup.find('div', attrs={"class": 'chart'})
26     #在页面寻找到表格的总体class="chart" 所以用soup.find寻找chart总表
27 
28     rows = table.find_all('tr')
29     #在检查界面发现所有的表格信息都在tr里面 所以用find_all寻找所有tr的信息放到rows里面
30 
31     data = []
32     # 先创建一个空的DataFrame来存储数据
33 
34 
35     for row in rows:
36         # 遍历每一行,并提取数据
37 
38         cells = row.find_all('td')
39         #找到所有的单元格是td的
40         #用print(cells)查看有多少td
41         #发现是15个 让td长度为15的才通过录入到date里面 否则无法进入
42 
43         if len(cells) == 15:
44             date=cells[0].text
45             Front_Area_1=cells[1].text
46             Front_Area_2=cells[2].text
47             Front_Area_3=cells[3].text
48             Front_Area_4=cells[4].text
49             Front_Area_5=cells[5].text
50             Back_Area_1 =cells[6].text
51             Back_Area_2 =cells[7].text
52             all_bonus   =cells[8].text
53             first_note  =cells[9].text
54             first_prize =cells[10].text
55             second_note =cells[11].text
56             second_prize=cells[12].text
57             Current_bankroll=cells[13].text
58             Award_date  =cells[14].text
59             #将每一元素的地址放到不同的单元里面 并且转化为text形式
60             #转化为text形式是为了将数据更好的放到表格中
61 
62             data.append([date, Front_Area_1, Front_Area_2, Front_Area_3, Front_Area_4, Front_Area_5, Back_Area_1 , Back_Area_2,
63                          all_bonus, first_note, first_prize, second_note, second_prize, Current_bankroll, Award_date])
64             #将所有数据放入到前面创建的data里面
65 
66     df = pd.DataFrame(data, columns=['期号', '前区号码1', '前区号码2', '前区号码3', '前区号码4', '前区号码5', '后区号码1', '后区号码2','奖池奖金(元)', '一等奖注数', '一等奖金(元)',
67                                      '二等奖注数', '二等奖金(元)', '总投注额(元)', '开奖日期'])
68     # 再将数据转换为DataFrame,加上列名
69 
70     df.to_csv('500_lottery_ticket.csv', index=True)
71     # 然后将文件导出为csv文件
72 else:
73     print("请求失败")
74     #若请求失败则直接返回请求失败
复制代码

 

 现在我们获得了一个名为500_lottery_ticket.csv的csv其中csv如下图所示

 

包含了我们所需要的所有数据

因为接下来后面进行词云处理那我简单的爬下https://live.500.com/2h1.php页面来获得文字信息的数据

以下是爬取赛事代码

复制代码
 1 import requests  # 导入requests库,用于发送HTTP请求
 2 from bs4 import BeautifulSoup  # 导入BeautifulSoup库,用于解析HTML内容
 3 import pandas as pd  # 导入pandas库,用于处理和操作数据
 4 from retry.api import retry_call  # 导入retry_call函数,用于重试机制
 5 
 6 url = "https://live.500.com/2h1.php"  # 定义目标URL
 7 
 8 response = requests.get(url)  # 发送GET请求获取页面内容
 9 if response.status_code == 200:  # 如果请求成功
10     print("请求成功")
11 
12     soup = BeautifulSoup(response.content, 'html.parser')  # 使用BeautifulSoup解析页面内容
13 
14     table = soup.find('div', attrs={"class": 'wrap'})  # 查找页面中具有class="wrap"的<div>元素
15 
16     rows = table.find_all('tr')  # 查找所有的<tr>元素,表示表格的行
17 
18     data = []  # 创建一个空列表来存储数据
19 
20     for row in rows:  # 遍历每一行
21         cells = row.find_all('td')  # 查找当前行中的所有<td>元素,表示单元格
22 
23         if len(cells) == 15:  # 如果单元格数量为15(符合要求)
24             game = cells[1].text  # 提取第二个单元格的文本内容,即赛事信息
25 
26             data.append([game])  # 将赛事信息添加到数据列表中
27 
28     df = pd.DataFrame(data, columns=['赛事'])  # 将数据列表转换为DataFrame,并设置列名为'赛事'
29 
30     df.to_csv('赛事.csv', index=True)  # 将DataFrame导出为CSV文件
31 
32 else:  # 如果请求失败
33     print("请求失败")
复制代码

同样获得赛事.csv的表格

 

 

2.接下来进行数据清洗和处理

复制代码
 1 import pandas as pd
 2 #导入pandas库进行数据清洗使用
 3 
 4 import matplotlib.pyplot as plt
 5 #导入matplotlib对后面数据可视化使用
 6 
 7 import numpy as np
 8 #导入numpu对后面使用随机函数使用
 9 
10 import seaborn as sns
11 
12 from wordcloud import WordCloud
13 import matplotlib.pyplot as plt
14 
15 
16 plt.rcParams['font.sans-serif'] = ['SimSun']
17 #让中文可以输出
18 
19 df=pd.read_csv("500_lottery_ticket.csv",
20                index_col=0)
21 #将刚刚处理好的csv导出到df内
22 
23 Front_Area_1_5=df.iloc[:,1:6]
24 #用切片的方式 获取前区号码1-5放入到Front_Area_1_5
25 
26 Back_Area_1_2=df.iloc[:,6:8]
27 #用切片的方式 获取后区号码1-2放入到Back_Area_1_2
28 
29 Front_Area_1_5_count=pd.value_counts(Front_Area_1_5.values.flatten())
30 #用pandas处理将 Front_Area_1_5中数据出现的数据的次数赋值到Front_Area_1_5_count中
31 Back_Area_1_2_count=pd.value_counts(Back_Area_1_2.values.flatten())
32 #用pandas处理将 Front_Area_1_5中数据出现的数据的次数赋值到Back_Area_1_2_count中
33 
34 colors = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#00FFFF', '#FF00FF', '#FFFFFF', '#000000', '#808080',
35           '#FFA500', '#800080', '#A52A2A', '#FFC0CB', '#ADD8E6', '#006400', '#FFD700', '#8B4513', '#4B0082',
36           '#00CED1', '#F0E68C', '#7B68EE', '#20B2AA', '#FF69B4', '#C71585', '#F5DEB3', '#ADFF2F']
37 #为了更好的可视化我添加了一些十六进制的颜色模块
复制代码

3.wordcloud的分词可视化处理

复制代码
 1 import pandas as pd  # 导入pandas库,用于数据处理和操作
 2 import matplotlib.pyplot as plt  # 导入matplotlib库,用于绘图
 3 from wordcloud import WordCloud  # 导入WordCloud模块,用于生成词云
 4 from PIL import Image  # 导入PIL库,用于处理图像
 5 import numpy as np  # 导入numpy库,用于数值计算
 6 from matplotlib import cm  # 导入cm模块,用于颜色映射
 7 
 8 # 读取CSV文件
 9 data = pd.read_csv('赛事.csv')
10 
11 # 将赛事列转换为字符串
12 text = ' '.join(data['赛事'])
13 
14 # 打开背景图片
15 background_image = Image.open('C:\\Users\\cmt\\Desktop\\ameng.png')
16 background_array = np.array(background_image)
17 
18 # 创建颜色映射
19 colormap = cm.get_cmap('Blues')  # 选择蓝色系列的颜色映射
20 
21 # 创建词云对象
22 wordcloud = WordCloud(font_path='C:\Windows\Fonts\微软雅黑\msyh.ttc', width=800, height=400,
23                       max_font_size=150, max_words=100, background_color='white',
24                       colormap=colormap, mask=background_array).generate(text)
25 # 设置词云的参数:
26 #font_path: 字体文件路径,这里使用微软雅黑字体 width: 词云图像的宽度 height: 词云图像的高度 max_font_size: 单词最大字号 max_words: 最大显示的单词数量
27 #background_color: 背景颜色,这里设置为白色 colormap: 颜色映射,这里使用之前创建的蓝色系列的颜色映射 mask: 词云的遮罩图像,这里使用之前打开的背景图片
28 
29 # 绘制词云
30 plt.figure(figsize=(10, 6))
31 # 创建一个10x6英寸大小的图像窗口
32 plt.imshow(wordcloud, interpolation='bilinear')
33 # 在图像窗口中显示词云图像,使用双线性插值进行平滑显示
34 plt.axis('off')
35 # 不显示坐标轴
36 plt.tight_layout()
37 # 自动调整子图参数,使之填充整个图像区域
38 
39 # 添加边框和背景色
40 plt.gca().patch.set_edgecolor('gray')
41 # 设置边框颜色为灰色
42 plt.gca().patch.set_linewidth('1')
43 # 设置边框宽度为1
44 plt.gca().set_facecolor('lightgray')
45 # 设置图像窗口的背景色为浅灰色
46 # 显示词云
47 plt.show()
复制代码

以下是生成的wordcloud  

 4.数据分析与可视化

 

复制代码
 1 plt.pie(Front_Area_1_5_count,
 2         colors=np.random.choice(colors,
 3                                 len(Front_Area_1_5_count)),
 4         labels=Front_Area_1_5_count.index,
 5         radius=1,
 6         wedgeprops={"width":0.3})
 7 
 8 plt.pie(Back_Area_1_2_count,
 9         colors=np.random.choice(colors,
10                                 len(Back_Area_1_2_count)),
11         labels=Back_Area_1_2_count.index,
12         radius=0.5,
13         wedgeprops={"width":0.2})
14 
15 #画一张刚刚处理好的数据出现次数的 图案 其中使用颜色时用的np.random随机选择颜色
16 #定义的半径为1和0.5 半径为0.3和0.2 这样两个圆环就可以嵌套在一起了
17 plt.show()
复制代码

 

运行后所产生的图像为以下饼图

 从图像中可知前五个号码为30,2,25,27,15中奖概率大后两个号码为7,12概率大

当日时间为2023/6/4号得到的结果

在2023/6/2号最新所开奖号码06 08 22 24 30 01 08

与结果进行比较不难发现 大多数中间号码都在前40%以内

 

以下画出一等奖注数与二等奖注数对比的图

 

复制代码
 1 color_palette = sns.color_palette("Set2")
 2 # 设置颜色调色板
 3 
 4 df[['一等奖注数', '二等奖注数']].plot.bar(color=color_palette)
 5 
 6 plt.xlabel('期号')
 7 
 8 plt.ylabel('注数')
 9 
10 plt.title('一等奖注数与二等奖注数对比')
11 
12 plt.legend(['一等奖注数', '二等奖注数'])
13 
14 plt.show()
15 
16 plt.show()
17 #画出一等奖二等奖的对比图
复制代码

 

结论:可以得出 当一等奖的注数与二等奖的注数有些许的正相关,同时也反映了近期大家购买力度的提升

以下画出一等奖注数变化趋势图

复制代码
 1 df['一等奖注数'].plot.line()
 2 
 3 plt.xlabel('期号')
 4 
 5 plt.ylabel('一等奖注数')
 6 
 7 plt.title('一等奖注数变化趋势')
 8 
 9 plt.show()
10 #一等奖注数变化趋势图
复制代码

 结论:可以的得出一等奖的注数变化趋势非常不稳定但是却又具有周期性,一个峰值后必会带一个低值

 

  以下画出奖池奖金变化趋势图

复制代码
 1 plt.figure(figsize=(8, 6))
 2 
 3 df['奖池奖金(元)'].plot()
 4 
 5 plt.xlabel('期号')
 6 
 7 plt.ylabel('奖池奖金(亿元)')
 8 
 9 plt.title('奖池奖金变化趋势')
10 
11 plt.xticks(rotation=45)
12 
13 plt.tight_layout()
14 
15 plt.show()
16 #奖池奖金变化趋势图
复制代码

 

 结论:在近第四十期的时候出现了一个极低值 据我分析可能是因为 五一的时候大家都出去旅游 导致对于彩票的购买率下降 进而可以说明节日也可能导致彩票的奖金

5.数据持久化

 

复制代码
 1 import requests
 2 from bs4 import BeautifulSoup
 3 import sqlite3
 4 import pandas as pd
 5 
 6 url = "https://datachart.500.com/dlt/history/newinc/history.php?limit=100&sort=0"
 7 
 8 response = requests.get(url)
 9 if response.status_code == 200:
10     print("请求成功")
11 
12     soup = BeautifulSoup(response.content, 'html.parser')
13     table = soup.find('div', attrs={"class": 'chart'})
14     rows = table.find_all('tr')
15 
16     data = []
17     for row in rows:
18         cells = row.find_all('td')
19         if len(cells) == 15:
20             date = cells[0].text
21             Front_Area_1 = cells[1].text
22             # ... 继续提取其他数据
23 
24             data.append([date, Front_Area_1, ...])
25 
26     df = pd.DataFrame(data, columns=['期号', '前区号码1', ...])
27 
28     # 连接到SQLite数据库
29     conn = sqlite3.connect('lottery_data.db')
30     cursor = conn.cursor()
31 
32     # 创建表
33     create_table_query = '''
34     CREATE TABLE IF NOT EXISTS lottery (
35         id INTEGER PRIMARY KEY AUTOINCREMENT,
36         期号 TEXT,
37         前区号码1 TEXT,
38         前区号码2 TEXT,
39         前区号码3 TEXT,
40         前区号码4 TEXT,
41         前区号码5 TEXT,
42         后区号码1 TEXT,
43         后区号码2 TEXT,
44         奖池奖金 TEXT,
45         一等奖注数 TEXT,
46         一等奖金 TEXT,
47         二等奖注数 TEXT,
48         二等奖金 TEXT,
49         总投注额 TEXT,
50         开奖日期 TEXT
51     );
52     '''
53     cursor.execute(create_table_query)
54 
55     # 插入数据
56     insert_query = 'INSERT INTO lottery (期号, 前区号码1, 前区号码2, ..., 开奖日期) VALUES (?, ?, ?, ..., ?);'
57     cursor.executemany(insert_query, df.values.tolist())
58 
59     # 提交事务并关闭连接
60     conn.commit()
61     conn.close()
62 
63     print("数据已保存到数据库")
64 else:
65     print("请求失败")
复制代码

在这个示例中,我们使用了SQLite数据库来创建名为"lottery_data.db"的数据库文件,并创建了一个名为"lottery"的表。然后,我们将从网页中提取的数据插入到该表中。

请注意,这只是一个示例,您可以根据自己的需求进行修改和扩展。另外,您需要安装SQLite库(通常已内置在Python中)来运行这段代码。

通过使用数据库进行数据持久化处理,您可以更方便地进行数据管理和查询操作。

6.将以上各部分的代码汇总,附上完整程序代码

 (1)爬虫代码部分

复制代码
 1 import requests
 2 from bs4 import BeautifulSoup
 3 #导入前两个库为爬虫所需要的库
 4 
 5 import pandas as pd
 6 #导入后面将数据转化格式的库
 7 
 8 from retry.api import retry_call
 9 
10 url = "https://datachart.500.com/dlt/history/newinc/history.php?limit=100&sort=0"
11 #所需要访问的网页为https://datachart.500.com/dlt/history/history.shtml
12 #(500)彩票网址 因为要查询的为100期的但 所以在检查里面寻找网络 将30期切换为100期
13 #出现了名称为history.php?limit=100&sort=0的文件 在表头的常规里面找到url即为所需的100期
14 
15 response = requests.get(url)
16 if response.status_code==200:
17     print("请求成功")
18 # 发送GET请求获取页面内容 若请求成功则继续 否则输出请求失败
19 
20 
21     soup = BeautifulSoup(response.content, 'html.parser')
22     # 使用BeautifulSoup解析页面内容 并用'html.parser'的方法解析
23     #在页面的检查界面的元素找到需要的表格信息的html所在地
24 
25     table = soup.find('div', attrs={"class": 'chart'})
26     #在页面寻找到表格的总体class="chart" 所以用soup.find寻找chart总表
27 
28     rows = table.find_all('tr')
29     #在检查界面发现所有的表格信息都在tr里面 所以用find_all寻找所有tr的信息放到rows里面
30 
31     data = []
32     # 先创建一个空的DataFrame来存储数据
33 
34 
35     for row in rows:
36         # 遍历每一行,并提取数据
37 
38         cells = row.find_all('td')
39         #找到所有的单元格是td的
40         #用print(cells)查看有多少td
41         #发现是15个 让td长度为15的才通过录入到date里面 否则无法进入
42 
43         if len(cells) == 15:
44             date=cells[0].text
45             Front_Area_1=cells[1].text
46             Front_Area_2=cells[2].text
47             Front_Area_3=cells[3].text
48             Front_Area_4=cells[4].text
49             Front_Area_5=cells[5].text
50             Back_Area_1 =cells[6].text
51             Back_Area_2 =cells[7].text
52             all_bonus   =cells[8].text
53             first_note  =cells[9].text
54             first_prize =cells[10].text
55             second_note =cells[11].text
56             second_prize=cells[12].text
57             Current_bankroll=cells[13].text
58             Award_date  =cells[14].text
59             #将每一元素的地址放到不同的单元里面 并且转化为text形式
60             #转化为text形式是为了将数据更好的放到表格中
61 
62             data.append([date, Front_Area_1, Front_Area_2, Front_Area_3, Front_Area_4, Front_Area_5, Back_Area_1 , Back_Area_2,
63                          all_bonus, first_note, first_prize, second_note, second_prize, Current_bankroll, Award_date])
64             #将所有数据放入到前面创建的data里面
65 
66     df = pd.DataFrame(data, columns=['期号', '前区号码1', '前区号码2', '前区号码3', '前区号码4', '前区号码5', '后区号码1', '后区号码2','奖池奖金(元)', '一等奖注数', '一等奖金(元)',
67                                      '二等奖注数', '二等奖金(元)', '总投注额(元)', '开奖日期'])
68     # 再将数据转换为DataFrame,加上列名
69 
70     df.to_csv('500_lottery_ticket.csv', index=True)
71     # 然后将文件导出为csv文件
72 else:
73     print("请求失败")
74     #若请求失败则直接返回请求失败
复制代码
复制代码
 1 import requests  # 导入requests库,用于发送HTTP请求
 2 from bs4 import BeautifulSoup  # 导入BeautifulSoup库,用于解析HTML内容
 3 import pandas as pd  # 导入pandas库,用于处理和操作数据
 4 from retry.api import retry_call  # 导入retry_call函数,用于重试机制
 5 
 6 url = "https://live.500.com/2h1.php"  # 定义目标URL
 7 
 8 response = requests.get(url)  # 发送GET请求获取页面内容
 9 if response.status_code == 200:  # 如果请求成功
10     print("请求成功")
11 
12     soup = BeautifulSoup(response.content, 'html.parser')  # 使用BeautifulSoup解析页面内容
13 
14     table = soup.find('div', attrs={"class": 'wrap'})  # 查找页面中具有class="wrap"的<div>元素
15 
16     rows = table.find_all('tr')  # 查找所有的<tr>元素,表示表格的行
17 
18     data = []  # 创建一个空列表来存储数据
19 
20     for row in rows:  # 遍历每一行
21         cells = row.find_all('td')  # 查找当前行中的所有<td>元素,表示单元格
22 
23         if len(cells) == 15:  # 如果单元格数量为15(符合要求)
24             game = cells[1].text  # 提取第二个单元格的文本内容,即赛事信息
25 
26             data.append([game])  # 将赛事信息添加到数据列表中
27 
28     df = pd.DataFrame(data, columns=['赛事'])  # 将数据列表转换为DataFrame,并设置列名为'赛事'
29 
30     df.to_csv('赛事.csv', index=True)  # 将DataFrame导出为CSV文件
31 
32 else:  # 如果请求失败
33     print("请求失败")
复制代码

 

(2)数据清洗加可视化代码

复制代码
  1 import pandas as pd
  2 #导入pandas库进行数据清洗使用
  3 
  4 import matplotlib.pyplot as plt
  5 #导入matplotlib对后面数据可视化使用
  6 
  7 import numpy as np
  8 #导入numpu对后面使用随机函数使用
  9 
 10 import seaborn as sns
 11 
 12 plt.rcParams['font.sans-serif'] = ['SimSun']
 13 #让中文可以输出
 14 
 15 df=pd.read_csv("500_lottery_ticket.csv",
 16                index_col=0)
 17 #将刚刚处理好的csv导出到df内
 18 
 19 Front_Area_1_5=df.iloc[:,1:6]
 20 #用切片的方式 获取前区号码1-5放入到Front_Area_1_5
 21 
 22 Back_Area_1_2=df.iloc[:,6:8]
 23 #用切片的方式 获取后区号码1-2放入到Back_Area_1_2
 24 
 25 Front_Area_1_5_count=pd.value_counts(Front_Area_1_5.values.flatten())
 26 #用pandas处理将 Front_Area_1_5中数据出现的数据的次数赋值到Front_Area_1_5_count中
 27 
 28 Back_Area_1_2_count=pd.value_counts(Back_Area_1_2.values.flatten())
 29 #用pandas处理将 Front_Area_1_5中数据出现的数据的次数赋值到Back_Area_1_2_count中
 30 
 31 colors = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#00FFFF', '#FF00FF', '#FFFFFF', '#000000', '#808080',
 32           '#FFA500', '#800080', '#A52A2A', '#FFC0CB', '#ADD8E6', '#006400', '#FFD700', '#8B4513', '#4B0082',
 33           '#00CED1', '#F0E68C', '#7B68EE', '#20B2AA', '#FF69B4', '#C71585', '#F5DEB3', '#ADFF2F']
 34 #为了更好的可视化我添加了一些十六进制的颜色模块
 35 
 36 plt.pie(Front_Area_1_5_count,
 37         colors=np.random.choice(colors,
 38                                 len(Front_Area_1_5_count)),
 39         labels=Front_Area_1_5_count.index,
 40         radius=1,
 41         wedgeprops={"width":0.3})
 42 
 43 plt.pie(Back_Area_1_2_count,
 44         colors=np.random.choice(colors,
 45                                 len(Back_Area_1_2_count)),
 46         labels=Back_Area_1_2_count.index,
 47         radius=0.5,
 48         wedgeprops={"width":0.2})
 49 
 50 #画一张刚刚处理好的数据出现次数的 图案 其中使用颜色时用的np.random随机选择颜色
 51 #定义的半径为1和0.5 半径为0.3和0.2 这样两个圆环就可以嵌套在一起了
 52 plt.show()
 53 
 54 color_palette = sns.color_palette("Set2")
 55 # 设置颜色调色板
 56 
 57 df[['一等奖注数', '二等奖注数']].plot.bar(color=color_palette)
 58 #导入df中的'一等奖注数', '二等奖注数'
 59 
 60 plt.xlabel('期号')
 61 #将x轴设为期号
 62 
 63 plt.ylabel('注数')
 64 #将y轴设为'注数'
 65 
 66 plt.title('一等奖注数与二等奖注数对比')
 67 #表名'一等奖注数与二等奖注数对比'
 68 
 69 plt.legend(['一等奖注数', '二等奖注数'])
 70 
 71 plt.show()
 72 
 73 plt.show()
 74 #画出一等奖二等奖的对比图
 75 
 76 df['一等奖注数'].plot.line()
 77 #将'一等奖注数'导入
 78 
 79 plt.xlabel('期号')
 80 #x轴设为'期号'
 81 
 82 plt.ylabel('一等奖注数')
 83 #y轴设为'一等奖注数'
 84 
 85 plt.title('一等奖注数变化趋势')
 86 #表名'一等奖注数变化趋势'
 87 
 88 plt.show()
 89 #一等奖注数变化趋势图
 90 
 91 
 92 df['奖池奖金(元)'] = df['奖池奖金(元)'].str.replace(',', '').astype(float)
 93 #更改'奖池奖金(元)'的信息,删去逗号
 94 
 95 df['奖池奖金(元)'].plot.hist(bins=20)
 96 #导入'奖池奖金(元)'
 97 
 98 plt.xlabel('奖池奖金(元)')
 99 #x轴设为'奖池奖金(元)'
100 
101 plt.ylabel('频数')
102 #y轴设为'频数'
103 
104 plt.title('奖池奖金分布直方图')
105 #表名'奖池奖金分布直方图'
106 
107 plt.show()
108 #奖池奖金分布直方图
109 
110 plt.figure(figsize=(8, 6))
111 
112 df['奖池奖金(元)'].plot()
113 #导入'奖池奖金(元)'
114 
115 plt.xlabel('期号')
116 #x轴设为'期号'
117 
118 plt.ylabel('奖池奖金(亿元)')
119 #y轴设为'奖池奖金(亿元)'
120 
121 plt.title('奖池奖金变化趋势')
122 #表名'奖池奖金变化趋势'
123 
124 plt.xticks(rotation=45)
125 
126 plt.tight_layout()
127 
128 plt.show()
129 #奖池奖金变化趋势图
复制代码

 

复制代码
 1 import pandas as pd  # 导入pandas库,用于数据处理和操作
 2 import matplotlib.pyplot as plt  # 导入matplotlib库,用于绘图
 3 from wordcloud import WordCloud  # 导入WordCloud模块,用于生成词云
 4 from PIL import Image  # 导入PIL库,用于处理图像
 5 import numpy as np  # 导入numpy库,用于数值计算
 6 from matplotlib import cm  # 导入cm模块,用于颜色映射
 7 
 8 # 读取CSV文件
 9 data = pd.read_csv('赛事.csv')
10 
11 # 将赛事列转换为字符串
12 text = ' '.join(data['赛事'])
13 
14 # 打开背景图片
15 background_image = Image.open('C:\\Users\\cmt\\Desktop\\ameng.png')
16 background_array = np.array(background_image)
17 
18 # 创建颜色映射
19 colormap = cm.get_cmap('Blues')  # 选择蓝色系列的颜色映射
20 
21 # 创建词云对象
22 wordcloud = WordCloud(font_path='C:\Windows\Fonts\微软雅黑\msyh.ttc', width=800, height=400,
23                       max_font_size=150, max_words=100, background_color='white',
24                       colormap=colormap, mask=background_array).generate(text)
25 # 设置词云的参数:
26 #font_path: 字体文件路径,这里使用微软雅黑字体 width: 词云图像的宽度 height: 词云图像的高度 max_font_size: 单词最大字号 max_words: 最大显示的单词数量
27 #background_color: 背景颜色,这里设置为白色 colormap: 颜色映射,这里使用之前创建的蓝色系列的颜色映射 mask: 词云的遮罩图像,这里使用之前打开的背景图片
28 
29 # 绘制词云
30 plt.figure(figsize=(10, 6))
31 # 创建一个10x6英寸大小的图像窗口
32 plt.imshow(wordcloud, interpolation='bilinear')
33 # 在图像窗口中显示词云图像,使用双线性插值进行平滑显示
34 plt.axis('off')
35 # 不显示坐标轴
36 plt.tight_layout()
37 # 自动调整子图参数,使之填充整个图像区域
38 
39 # 添加边框和背景色
40 plt.gca().patch.set_edgecolor('gray')
41 # 设置边框颜色为灰色
42 plt.gca().patch.set_linewidth('1')
43 # 设置边框宽度为1
44 plt.gca().set_facecolor('lightgray')
45 # 设置图像窗口的背景色为浅灰色
46 # 显示词云
47 plt.show()
复制代码

 

(3)数据持久化代码

复制代码
 1 import requests
 2 from bs4 import BeautifulSoup
 3 import sqlite3
 4 import pandas as pd
 5 
 6 url = "https://datachart.500.com/dlt/history/newinc/history.php?limit=100&sort=0"
 7 
 8 response = requests.get(url)
 9 if response.status_code == 200:
10     print("请求成功")
11 
12     soup = BeautifulSoup(response.content, 'html.parser')
13     table = soup.find('div', attrs={"class": 'chart'})
14     rows = table.find_all('tr')
15 
16     data = []
17     for row in rows:
18         cells = row.find_all('td')
19         if len(cells) == 15:
20             date = cells[0].text
21             Front_Area_1 = cells[1].text
22             # ... 继续提取其他数据
23 
24             data.append([date, Front_Area_1, ...])
25 
26     df = pd.DataFrame(data, columns=['期号', '前区号码1', ...])
27 
28     # 连接到SQLite数据库
29     conn = sqlite3.connect('lottery_data.db')
30     cursor = conn.cursor()
31 
32     # 创建表
33     create_table_query = '''
34     CREATE TABLE IF NOT EXISTS lottery (
35         id INTEGER PRIMARY KEY AUTOINCREMENT,
36         期号 TEXT,
37         前区号码1 TEXT,
38         前区号码2 TEXT,
39         前区号码3 TEXT,
40         前区号码4 TEXT,
41         前区号码5 TEXT,
42         后区号码1 TEXT,
43         后区号码2 TEXT,
44         奖池奖金 TEXT,
45         一等奖注数 TEXT,
46         一等奖金 TEXT,
47         二等奖注数 TEXT,
48         二等奖金 TEXT,
49         总投注额 TEXT,
50         开奖日期 TEXT
51     );
52     '''
53     cursor.execute(create_table_query)
54 
55     # 插入数据
56     insert_query = 'INSERT INTO lottery (期号, 前区号码1, 前区号码2, ..., 开奖日期) VALUES (?, ?, ?, ..., ?);'
57     cursor.executemany(insert_query, df.values.tolist())
58 
59     # 提交事务并关闭连接
60     conn.commit()
61     conn.close()
62 
63     print("数据已保存到数据库")
64 else:
65     print("请求失败")
复制代码

五、总结

爬取的500彩票大乐透近100期的数据的爬虫过程我遇到的困难:

 我在爬取500彩票大乐透近100期的数据网站之前也尝试过爬取其他网站,比如瓜子二手车,等等,我在这些网站爬取了很久的时间,但还是没有获得我想要的数据,这些网站的反爬虫机制写的很不错,有ip封锁,文字转化,以及一些验证码什么的很具有挑战性,但是我学艺不精,选择了一个较为简单的网站。

通过这个爬虫过程,你不仅获取了数据,还学到了许多与网页爬取和数据处理相关的技能。这些技能对于从网页中获取数据、进行数据分析和构建数据应用程序都非常有用,继续学习和实践,可以扩展这些技能并应用到更广泛的场景中。

爬取的500彩票大乐透近100期的数据经过数据处理和可视化分析后的结果,我得到

数据处理:

  1. 数据清洗和整理:对于爬取的数据进行清洗,去除重复数据,处理缺失值,规范化数据格式等,确保数据的准确性和一致性。
  2. 数据转换和格式化:将数据转换为适合分析和可视化的格式,例如将日期转换为时间格式,将奖金金额转换为数字格式等。
  3. 数据提取和衍生:从原始数据中提取有用的信息,例如分解大乐透号码为前区号码和后区号码,计算奖池奖金的变化量等。

可视化分析:

  1. 号码分布:使用柱状图或热力图等可视化方法,展示大乐透号码的分布情况,包括前区号码和后区号码的出现频率、遗漏情况等。可以帮助您了解哪些号码相对较热门,哪些号码较冷门。
  2. 奖池变化趋势:使用折线图展示大乐透奖池的变化趋势,可以观察奖池金额的增长和下降情况,帮助您了解奖池的变化规律。
  3. 奖项分布:使用条形图展示不同奖项的中奖情况,包括一等奖、二等奖等各个奖项的中奖注数和中奖金额,可以对奖项的分布情况进行直观分析。
  4. 历史趋势分析:通过绘制折线图或曲线图,分析大乐透历史数据中的趋势和模式,例如号码的周期性出现、奖项的中奖频率等。

 这些分析结果可以帮助您更好地理解大乐透的历史数据特征和规律,提供一些参考信息,但并不能保证预测未来的开奖结果。彩票是一种随机的游戏,结果是无法预测的,这些分析结果仅供参考和娱乐。

总之,对于这些数据分析的结果知道想要“一夜暴富”真的蛮难的哦!彩票这种东西是缥缈的,所以大家好好上学,多学知识,这样才能不断完善自身,实现间接性“一夜暴富”。

 

posted @   挽联  阅读(1600)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示