Python网络爬虫抓取彩票排列3全部历史数据

之前学了福彩3D网络爬虫技术,然后我研究了一天时间,写了一个体彩排列3爬虫抓取程序,为了感谢网友们的贡献,我决定分享代码
首先找一家比较大型的网站,500彩票网,因为是美国上市公司,轻易不会黄,这样写的代码用的时间能长些.
http://datachart.500.com/pls/

分析一下这个网页的内容,可以输入开奖期号一次查看排列3全部历史数据,但是网页代码我看不太懂,于是我开了一个http抓包程序Fiddler.

得到真实url
http://datachart.500.com/pls/history/inc/history.php?limit=15116&start=04001&end=19117

上边连接中04001是排列3上市第一期的期号,19117是我写这个程序时当天的开奖期号.

然后开始写Python代码,需要注意的是,有时候访问这个网页会失败,这是因为一次要求获取的数据太多了,打不开就重试,一定能成.

保存到本地的文件名是pl3.xls,数据全抓出来了,下一步如何分析预测就看网友们的集体智慧了

# -*- coding: utf-8 -*-
"""
Created on Sat May  4 22:00:31 2019
@author: Administrator
"""
import requests #爬虫库
import xlwt #写excel表库
import time #时间获取转换
from bs4 import BeautifulSoup #爬虫库

# 获取网页内容
def get_html(url):
    #这是一个UA伪装,告诉网站你浏览器和操作系统系统
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    response = requests.get(url, headers = headers)#用爬虫对象获取网页内容
    if response.status_code == 200:#对象状态码等于200说明获取网页内容成功
        print('读取网页成功!')
        return response.text#返回获取的网页内容
    else:
        print('读网页失败,无数据!')
    return None

# 解析网页内容
def parse_html(html):
    soup = BeautifulSoup(html, 'lxml')#创建网页解析器对象
    i = 0
    #查找网页里的tr标签,从第4个tr读到倒数第2个tr,因为通过对网页分析,前三个和最后一个tr没用
    for item in soup.select('tr')[3:-1]:#把查到的tr组成一个列表,item是列表指针,for每循环一次,item就选下一个tr,读完列表本循环结束,函数就结束,
        try:   #不加try和except有的值是 ,是网页里的空白键,会出错,加上调试命令忽略错误,后边统一处理             
            yield{ #yield作用是得到数据立即返回给调用函数,但不退出本循环本函数
                    'issue':item.select('td')[i].text,#item查到的第0个td是开奖期号,写到time列
                    'WinningNumbers':item.select('td')[i+1].text,#0+1个td是中奖号码
                    'sum':item.select('td')[i+2].text,#总和数
                    'Totalsales':item.select('td')[i+3].text,#总销售额
                    'Direct':item.select('td')[i+4].text,#直选中奖注数
                    'Direct_bonus':item.select('td')[i+5].text,#直选总奖金
                    'three_selection':item.select('td')[i+6].text,#组选3中奖注数
                    'three_selection_bonus':item.select('td')[i+7].text,#组选3总奖金
                    'six__selection':item.select('td')[i+8].text,#组选6中奖数
                    'six__selection_bonus':item.select('td')[i+9].text,#组选6总奖金
                    'time':item.select('td')[i+10].text#开奖日期
                    #一组数据读完马上把值返回给调用函数,但没有退出本函数和本循环,
                    #调用函数得到数据,写到excel对象里,然后又回到这里,本次循环结束,开始下一次循环,item列表指针
                    }
        except IndexError:
            pass
              


# 将数据写入excel表
def write_to_excel():
    f = xlwt.Workbook() #创建excel表对象
    sheet1 = f.add_sheet('pl3', cell_overwrite_ok=True)#创建表,名叫3D
    row0 = ['期号','中奖号码','总和','总销售额(元)','直选注数','直选奖金','组选3注数','组选3奖金','组选6注数','组选6奖金','开奖日期']#把所有列名做成一个list表
    # 写入第一行
    for j in range(0, len(row0)):#用循环把每一列的名称按顺序写上去
        sheet1.write(0, j, row0[j])#写第0行,第几列的内容

    # 爬取网页,将结果写入excel对象
    i = 0
    #用fiddler网页抓包得到真实网页地址,一次获取全部历史数据
    url = 'http://datachart.500.com/pls/history/inc/history.php?limit=15116&start=04001&end=19117'
    html = get_html(url)#调用自定义函数,读网页获取网页内容
    print('正在提取保存数据......')
    if html != None:        #如果读网页没出错,读成功,则进行下一步,
        # 写入每一期信息
        '''
        调用自定义函数分析提取网页数据,保存到excel对象表中,item是循环中所调用的parse_html函数里的对象,是一个字典类型数据
        就是提取其它函数的item对象数据,写到excel表对象里
        '''
        for item in parse_html(html):
            #下边的if是为了去掉列表里的乱码 ,在网页里显示为空白,用0代替
            if item['three_selection']==' ':
                item['three_selection']='0'
                item['three_selection_bonus']='0'
            else:
                item['six__selection']='0'
                item['six__selection_bonus']='0'
            
            sheet1.write(i+1, 0, item['issue'])#写到excel表里第i+1行,第0列,写item的time键数据
            sheet1.write(i+1, 1, item['WinningNumbers'])
            sheet1.write(i+1, 2, item['sum'])
            sheet1.write(i+1, 3, item['Totalsales'])
            sheet1.write(i+1, 4, item['Direct'])
            sheet1.write(i+1, 5, item['Direct_bonus'])
            sheet1.write(i+1, 6, item['three_selection'])
            sheet1.write(i+1, 7, item['three_selection_bonus'])
            sheet1.write(i+1, 8, item['six__selection'])
            sheet1.write(i+1, 9, item['six__selection_bonus'])
            sheet1.write(i+1, 10, item['time'])
            i += 1#写完一轮换行准备下次循环写下一行
                
    try:
        f.save('pl3.xls')
        print('写入EXCEL表pl3.xls成功!')
    except:
        print('写入EXCEL表失败')
        
#主函数就是调用其它函数,作用是将数据写入excel表
def main():
    write_to_excel()#自定义函数,将数据写入excel表

#这是程序真正开始执行处,如果程序被直接执行了而不是被当作库调用,则运行main()函数
if __name__ == '__main__':
    main()

Python网络爬虫抓取彩票排列3全部历史数据_第1张图片

你可能感兴趣的:(Python)