import requests
import time
deffetch_lottery_data(start_period, end_period):"""
抓取指定期号范围的数据
"""# 500彩票网的历史数据接口(这是一个公开的静态页面接口)
target_url ="https://datachart.500.com/ssq/history/newinc/history.php"# 构造参数:start 和 end 是期号,例如 '03001' 到 '23150'
params ={'start': start_period,'end': end_period
}
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}try:print(f"🔄 Requesting data from {start_period} to {end_period}...")
response = requests.get(target_url, params=params, headers=headers, timeout=15)
response.raise_for_status()
response.encoding ='utf-8'# 显式指定编码,防止日期乱码return response.text
except Exception as e:print(f"❌ Connection Failed: {e}")returnNone
7️⃣ 核心实现:解析层(Parser)
这是本篇最精华的部分。我们需要从成百上千个
标签中准确提取数据。
from bs4 import BeautifulSoup
defparse_html_table(html_content):"""
解析 HTML 表格并返回结构化数据列表
"""
soup = BeautifulSoup(html_content,'lxml')
data_rows =[]# 定位核心表格:通常有一个特定的 ID 或 class# 在该网站中,数据行位于 id="tdata" 的 tbody 下
tbody = soup.find('tbody',id='tdata')ifnot tbody:print("⚠️ Error: Could not find the data table. Structure might have changed.")return[]# 遍历每一行 tr# class="t_tr1" 是数据行的特征,避免抓到表头
rows = tbody.find_all('tr', class_='t_tr1')for row in rows:
cells = row.find_all('td')# 容错检查:确保这一行有足够的数据格iflen(cells)<10:continue# 根据网页结构提取字段(需要对着网页源码数格子)# 0: 期号, 1-6: 红球, 7: 蓝球, 15: 开奖日期 (假设)try:
issue = cells[0].text.strip()# 红球通常在第 2 到 第 7 列 (索引 1-6)
red_balls =[cells[i].text.strip()for i inrange(1,7)]# 蓝球在第 8 列 (索引 7)
blue_ball = cells[7].text.strip()# 开奖日期通常在最后一列或特定列,这里假设是第 16 列(索引 15)# 具体索引需根据实际网页调整,500网通常是最后一个td或指定位置
date_str = cells[-1].text.strip()
data_rows.append({'Issue': issue,'Date': date_str,'Red_1': red_balls[0],'Red_2': red_balls[1],'Red_3': red_balls[2],'Red_4': red_balls[3],'Red_5': red_balls[4],'Red_6': red_balls[5],'Blue': blue_ball,'Full_Draw':f"{','.join(red_balls)}|{blue_ball}"# 方便直观查看})except IndexError as e:print(f"⚠️ Parsing Error on row: {issue if'issue'inlocals()else'Unknown'} - {e}")continuereturn data_rows
8️⃣ 数据存储与导出(Storage)
对于表格类数据,Pandas 是绝对的王者。
import pandas as pd
import os
defsave_lottery_data(data_list):ifnot data_list:print("⚠️ No data to save.")return
df = pd.DataFrame(data_list)# 数据清洗:按期号排序
df.sort_values(by='Issue', ascending=False, inplace=True)
filename ="lottery_history_ssq.csv"# 导出
df.to_csv(filename, index=False, encoding='utf-8-sig')print(f"💾 Success! Saved {len(df)} records to {filename}")# 打印前 3 行预览print("
📊 Data Preview:")print(df[['Issue','Date','Full_Draw']].head(3).to_markdown(index=False))