1. 背景及目的
双色球开奖有没有什么规律?历史开奖的情况是怎么样的?能否利用历史数据,进行开奖结果预测?利用历史数据进行预测的极限准确率是多少?想要解读以上疑问的话,首先必须拿到双色球的历史开奖记录。
本次爬取双色球历史开奖记录的目的:
-
拿到历史数据,为解答以上疑问提供数据基础; -
提升应用Python进行数据爬取的能力;
2. 寻找数据源
思路:双色球作为一种公益福利彩,全国均可购买,其背后必然会有官网。因此,可上双色球官网寻找历史开奖记录。
官网开奖网址:双色球官网开奖记录
经确认,官网只展示仅100期的开奖结果,显然,不符合要求。
思路:双色球经过多年的发展,在全国具有如此大的规模,必定会衍生出其他相关公司或机构,会记录历史开奖记录。
经过查找,果然找到了:双色球频道历史开奖记录
经确认,第一期双色球开奖日期是2003年2月23日,该网址包含了最早的开奖记录,符合本次要求。
3. 开始爬取数据
3.1 获取总页数
import requests
url = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list.html'
html = requests.get(url=url)
html_text = html.text
soup = BeautifulSoup(html_text, 'html.parser')
str_total_page = soup.select('tr td p > strong')[0].text
total_page = int(str_total_page)
print(total_page)
3.2 获取网页内容
import pandas as pd
from bs4 import BeautifulSoup
import time, random
import re
columns = ['开奖日期','期号','红球1','红球2','红球3','红球4','红球5','红球6','蓝球','销售额(元)','中一等奖注数','中二等奖注数']
df = pd.DataFrame(columns=columns)
for page in range(total_page):
# 打印当前抓取的页数
print('正在抓取第%d页...' % (page + 1))
url = 'http://kaijiang.zhcw.com/zhcw/inc/ssq/ssq_wqhg.jsp?pageNum={page}'.format(page=page + 1)
html = requests.get(url=url)
html_text = html.text
soup = BeautifulSoup(html_text, 'html.parser')
try:
# 遍历所有tr标签
for tr in soup.find_all('tr'):
# 排除开头和结尾
if '一等奖' not in tr.text and '开奖日期' not in tr.text and '首页' not in tr.text:
# 解析开奖结果
result = tr.text.strip().split()
print(result)
if len(result) < df.shape[1]:
pass
elif len(result) == df.shape[1]:
df_tr = pd.DataFrame([result], columns=columns)
df = df.append(df_tr, ignore_index=True)
else:
print('注意:第%d页存在中文,已剔除...' % (page + 1))
for i in result.copy(): # 注意:一定需要加上.copy(),否则 remove 不完整
if re.compile('[0-9]+').findall(i):
pass
else:
result.remove(i)
# 解析开奖结果
print(result)
df_tr = pd.DataFrame([result], columns=columns)
df = df.append(df_tr, ignore_index=True)
except Exception as e:
print('遇到未知错误,需检查处理:%s' % e)
# 随机暂停,减少对服务器的压力
pause_seconds = random.randint(0, 2)
print('为减少服务器压力,随机暂停%d秒...' % pause_seconds)
time.sleep(pause_seconds)
df
3.3 保存到本地
df.to_excel(r'D:\桌面\result.xlsx')
至此,双色球历史开奖记录爬取成功。
4. 参考资料
-
BeautifulSoup 使用方法(中文文档,含select用法):Beautiful Soup 4.4.0 文档 -
BeautifulSoup 使用方法(案例):Python爬虫利器二之Beautiful Soup的用法 -
list 转置:python list转置过程详细介绍 -
判断字符串是否包含某字符:Python--判断一个字符串是否包含某子串的几种方法 - 云+社区 - 腾讯云 -
DataFrame 的 append 方法:pandas.DataFrame.append - pandas 1.3.5 documentation -
判断字符串是否包含数字:python 判断字符串中是否包含数字 -
list去掉某元素:Python List remove()方法 -
打印错误提示:python打印异常信息的两种实现方式_python_脚本之家 -
正则判断字符中是否包含数字:Python 正则表达式判断字符串中是否包含数字 -
【避坑】list元素无法通过for循环来remove:python:在for遍历list时使用remove出现的问题以及解析_明日韭菜-CSDN博客 -
remove 列表中元素的正确操作方式:python列表使用remove方法容易犯错的地方_makerroot的博客-CSDN博客_python用remove报错 -
Python 捕获所有异常:Python 捕获所有异常_changqing1234的专栏-CSDN博客_python捕获所有异常 -
获取DataFrame的列数:如何获取Dataframe的行数和列数_lwgkzl的博客-CSDN博客_dataframe 行数 -
Python 生成随机数:Python 随机数生成 | 菜鸟教程
|