python双色球-(一)采集双色球历史数据

多年之后,再次感受双色球的魅力,芸芸众生都为之倾倒,但是温馨提示:赌博有风险,本文仅做数据处理技术讨论,不构成任何资金投入建议!

现如今的IT行业竞争越来越激烈,一线大厂都是各种裁员,IT35定律不说是绝对,但是市场的反应很现实也很真实,那就是不管你是不是35以上,岗位都在缩减,有人IT转了快递外卖小哥,有的转了煎饼师傅,有的转了滴滴师傅,惨烈的状况到处可见,所以买彩票的人更多了,为了一探究竟决定再次研究一下这神秘的五百万头奖,先从数据采集开始,详细代码如下,送给需要改变现状的我们!

import requests  # 发送请求
from bs4 import BeautifulSoup  # 解析网页
import pandas as pd  # 存取csv
from time import sleep  # 等待时间
from lxml import etree # 导入xpath包
import openpyxl,random

# 加载工作薄
wb = openpyxl.Workbook()
# 如果不存在即创建
wb.save(r'DoubleBall.xlsx')

# 打开excel工作簿
wb = openpyxl.load_workbook(r'DoubleBall.xlsx')
# 准备写工作簿中第一个sheet页
sheet1 = wb.worksheets[0]

# 为数据页循环标识
indexnum = 1
print('爬取开始了')
#http://kaijiang.zhcw.com/zhcw/html/ssq/list_2.html
# 初始化URL第一页地址
url = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list.html'
# 请求头部,伪造浏览器,防止爬虫被反
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 定义excel中的行数
indexcount = 0
# 初步了解数据总页数为151,可以放更大的值
while indexnum < 152:
    #如果不是数据页第一页则拼接数据页地址
    if indexnum > 1:
        url = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list_' + str(indexnum) + '.html'

    # 利用请求地址和请求头部构造请求对象
    res = requests.get(url, headers=headers)
    # BeautifulSoup解析包
    soup = BeautifulSoup(res.text, 'html.parser')
    # xpath解析包 构造 _Element 对象
    res_elements = etree.HTML(res.text)
    
    # 使用 xpath 匹配数据,找到页面的table列表标签 ,
    table = res_elements.xpath('//table')
    # 函数可以将转换为Element对象再转换回html字符串
    table = etree.tostring(table[0], encoding='utf-8').decode()
    # read_html()函数是将HTML的表格转换为DataFrame
    df = pd.read_html(table, encoding='utf-8', header=0)[0]
    # 将dataframe进行转置,进而用to_dict()方法转为字典类型
    results = list(df.T.to_dict().values())

    # 根据每页数据条数,控制循环次数
    count = 1    
    # 循环取每页的数据
    for index in results:
        # 只有第一页和非第一页且不是第一条数据需要取出来存放到excel(因为每页都有表头)
        if indexnum == 1 or (indexnum != 1 and count != 1):
            # 如果一页的数据循环到最后一条时退出,跳转到下一页
            if count < len(results):
                # 定义并赋值数据所需要存储的行号
                indexcount = (indexnum - 1)*20 + count
                sheet1.cell(indexcount,1,index.get('开奖日期'))
                sheet1.cell(indexcount,2,index.get('期号'))
                # 由于所有号码都是存在一个值当中,所以需要通过按空格分隔为list
                listball = index.get('中奖号码').split()
                # 判断数据是否第一行是否为表头,如果大于1就不是,则动态赋值,如果是则直接写文字内容
                if len(listball) > 1:
                    sheet1.cell(indexcount,3,listball[0])
                    sheet1.cell(indexcount,4,listball[1])
                    sheet1.cell(indexcount,5,listball[2])
                    sheet1.cell(indexcount,6,listball[3])
                    sheet1.cell(indexcount,7,listball[4])
                    sheet1.cell(indexcount,8,listball[5])
                    sheet1.cell(indexcount,9,listball[6])
                else:
                    sheet1.cell(indexcount,3,'红球1')
                    sheet1.cell(indexcount,4,'红球2')
                    sheet1.cell(indexcount,5,'红球3')
                    sheet1.cell(indexcount,6,'红球4')
                    sheet1.cell(indexcount,7,'红球5')
                    sheet1.cell(indexcount,8,'红球6')
                    sheet1.cell(indexcount,9,'蓝球')
                    
                sheet1.cell(indexcount,10,index.get('中奖注数'))
                sheet1.cell(indexcount,11,index.get('中奖注数.1'))
        
                
        count+=1
            
    indexnum+=1

# 保存关闭excel
wb.save(r'DoubleBall.xlsx')
print('爬取结束了')

你可能感兴趣的:(python,开发语言,beautifulsoup,pandas)