【python实战】助力双色球之历史号码采集
前言
估计都有过一夜大富贵的梦想,比如中个大奖,这个项目就是白日做梦的时候写下,抓取双色球网站的公开的双色球历次数据。
注意哈,是公开数据。
本次
目录
一、目标
- 抓取网址
用python抓取网站的历代开奖号码,最终导出excel。
- 抓取对象如下
- 抓取页数
抓取一个网站的html中的静态或动态公开信息
二、具体工作
1.1、引用
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import json
from datetime import datetime
import time
import pandas as pd
- from selenium import webdriver
导入 Selenium 的 webdriver 模块,用于自动化控制浏览器。这是 Selenium 的核心模块,用于启动和控制浏览器(如 Chrome、Firefox、Edge)。
- from selenium.webdriver.chrome.service import Service
帮助设置和管理 Selenium 与 Chrome 浏览器交互所需的 ChromeDriver 可执行文件,如导入 Service 类,用于管理 ChromeDriver 服务
- from selenium.webdriver.common.by import By
用于处理动态加载的内容,等待元素出现或变为可交互状态,如导入 By 类,用于定位网页上的元素。
- from selenium.webdriver.support import expected_conditions as EC
导入 expected_conditions 模块,提供一组预定义的条件,用于与 WebDriverWait 配合使用
- from bs4 import BeautifulSoup
导入 BeautifulSoup 类,用于解析 HTML 和 XML 文档帮助从网页的 HTML 内容中提取和操作数据
- import json
导入 json 模块,用于处理 JSON 数据。用于解析 JSON 字符串或将 Python 对象(如字典)转换为 JSON 格式。
- from datetime import datetime
导入 datetime 类,用于处理日期和时间。用于为数据添加时间戳或格式化日期。
- import time
导入 time 模块,提供与时间相关的函数。通常用于在脚本中添加延迟(例如 time.sleep(5) 暂停 5 秒)。
- import pandas as pd
导入 pandas 库并将其别名设置为 pd。Pandas 用于数据操作和分析。帮助将抓取的数据组织成结构化格式(如 DataFrame),并导出到文件(如 CSV、Excel)。
1.1、浏览器页面中代码获取
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
用于设置浏览器的启动参数。这些参数会传递给 ChromeDriver,从而影响浏览器的启动方式
# 初始化浏览器
driver = webdriver.Chrome(options=options)
# 访问页面
driver.get(url)
# 等待表格加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'ssq_table'))
)
# 获取页面源码
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
1.2、页面模块处理
总计处理两个模块,这也是我们的设计的业务逻辑。
- A 数据模块
- B 页数模块
1.3、页数模块
# 获取最大页数
pagination = soup.find('div', class_='layui-box layui-laypage layui-laypage-molv')
if pagination:
last_page = pagination.find('a', class_='layui-laypage-last')
if last_page and 'data-page' in last_page.attrs:
max_page = int(last_page['data-page'])
print(f"总页数: {max_page}")
results = []
current_page = 1
1.4、数据模块
循环取得每页的数据,采用while循环
获取模块下class_='ssq_table'单元子元素
获取动态数据find_all('tr', attrs={"data-alias": True})
遍历双色球for ball in qiu_container.find_all('div', class_='qiu-item'
最后获得下一页相同的方式的数据
while current_page <= max_page:
print(f"正在抓取第 {current_page}/{max_page} 页数据...")
# 获取当前页数据
tables = soup.find_all('table', class_='ssq_table')
for table in tables:
tbody = table.find('tbody')
if tbody:
for row in tbody.find_all('tr', attrs={"data-alias": True}):
cols = row.find_all('td')
if len(cols) > 10:
continue
# Find the container with class "qiu"
qiu_container = row.find('div', class_='qiu')
# Find all child elements with the class "qiu-item"
# balls = [qiu_container.text.strip()]
balls = [ball.text.strip() for ball in qiu_container.find_all('div', class_='qiu-item')]
red_balls = balls[:6]
blue_ball = balls[-1] if len(balls) > 6 else ''
data = {
'期号': cols[0].text.strip(),
'开奖日期': cols[1].text.strip(),
'红球': red_balls,
'蓝球': blue_ball,
'奖池金额': cols[8].text.strip(),
'一等奖注数': cols[3].text.strip(),
'一等奖奖金': cols[4].text.strip(),
'二等奖注数': cols[5].text.strip(),
'二等奖奖金': cols[6].text.strip()
}
results.append(data)
# 如果还有下一页,点击下一页
if current_page < max_page:
try:
next_button = driver.find_element(By.CLASS_NAME, 'layui-laypage-next')
next_button.click()
# 等待新页面加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'ssq_table'))
)
# 更新页面源码
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
except Exception as e:
print(f"翻页失败: {str(e)}")
break
current_page += 1
driver.quit()
这是最精髓双色球数据格式
<div class="qiu">
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-red">3</div>
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-red">8</div>
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-red">10</div>
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-red">20</div>
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-red">30</div>
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-red">31</div>
<div class="qiu-item qiu-item-small qiu-item-wqgg-zjhm-blue">2</div></div>
1.5、保存结果
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
output_file = f'ssq_table_pagination_{len(results)}_{timestamp}.xlsx'
df = pd.DataFrame(results)
df.to_excel(output_file, index=False, encoding='utf-8')
print(f'成功抓取{len(results)}期数据,保存至{output_file}')
strftime('%Y%m%d_%H%M%S') 用于格式化日期和时间的函数
DataFrame(results) 存储和操作结构化数据
to_excel(output_file, index=False, encoding='utf-8') 转为excel
三、运行图示
四、总结
- 最开始是保存json,但是数据太长,导致读取失败,还是保存excel,可以读取
- 模块化处理业务逻辑,模块化量化思维
- 不要爬私密信息
写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。
五、下载
原文地址:https://blog.csdn.net/longstar777/article/details/145196867
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!