自学内容网 自学内容网

【python实战】助力双色球之历史号码采集

前言

        估计都有过一夜大富贵的梦想,比如中个大奖,这个项目就是白日做梦的时候写下,抓取双色球网站的公开的双色球历次数据

        注意哈,是公开数据。

        本次


目录

一、目标

二、具体工作

        1.1、引用

        1.1、浏览器页面中代码获取

        1.2、页面模块处理

        1.3、页数模块

        1.4、数据模块

        1.5、保存结果

三、运行图示 

四、总结

五、下载


一、目标

  •    抓取网址

        用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,可以读取
  •    模块化处理业务逻辑,模块化量化思维
  •    不要爬私密信息

写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。 


五、下载

        excel数据下载

        工程项目下载


原文地址:https://blog.csdn.net/longstar777/article/details/145196867

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!