鱼C论坛

 找回密码
 立即注册
查看: 5135|回复: 24

利用PYTHON导出双色球数据

[复制链接]
发表于 2019-12-24 10:41:20 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
http://www.zhcw.com/ssq/
利用python导出中彩网双色球2018年1月1日至2018年10月28日的开奖数据,并保存至EXCEL中。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-24 12:49:59 From FishC Mobile | 显示全部楼层
请求高手及时指导。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-24 14:01:32 | 显示全部楼层
  1. # coding=utf-8

  2. '''
  3. 福利彩票,抓取2018年全年中奖号码
  4. '''

  5. import requests
  6. from lxml import etree

  7. def getLottery() :
  8.         # 实际地址,经过浏览器捕捉,发现是这个地址后面带上页码加上.html
  9.         url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_'
  10.         headers = {
  11.                 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'
  12.         }
  13.         for i in range(8, 16) :
  14.                 realURL = url + str(i) + '.html'
  15.                 response = requests.get(realURL, headers = headers)
  16.                 content = etree.HTML(response.text)
  17.                 # 这里是以表格来排布,前两行是表头,无需抓取,
  18.                 # 从第三行到倒数第二行为开奖信息,这里用循环处理
  19.                 for j in range(3, 23) :
  20.                         label_td = 1
  21.                         # 获取开奖日期、期号和中奖号码的标签位置
  22.                         lotteryDatePath = "/html/body/table/tr[" + str(j) + "]/td[" + str(label_td) + "]/text()"
  23.                         dateNumPath = "/html/body/table/tr[" + str(j) + "]/td[" + str(label_td + 1) + "]/text()"
  24.                         ballNumPath = "/html/body/table/tr[" + str(j) + "]/td[" + str(label_td + 2) + "]/em/text()"

  25.                         # 获取各标签位的内容
  26.                         lotteryDate = content.xpath(lotteryDatePath)[0]
  27.                         dateNum = content.xpath(dateNumPath)[0]
  28.                         ballNum = content.xpath(ballNumPath)
  29.                         realBallNum = ' '.join(ballNum)

  30.                         print(lotteryDate, ' ', dateNum, ' ', realBallNum)

  31. getLottery()
复制代码


还没写完,先把每一期的号码抓下来,待会儿把写入 excel 的操作弄出来了,再把全量代码贴上来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-24 14:39:14 | 显示全部楼层
本帖最后由 foxiangzun 于 2019-12-24 14:41 编辑
  1. # coding=utf-8

  2. '''
  3. 福利彩票,抓取2018年全年中奖号码
  4. '''

  5. import requests
  6. import time
  7. import random
  8. import openpyxl as opxl
  9. from lxml import etree

  10. class lottery() :
  11.         def __init__(self, *avgr):
  12.                 self.saveLocation = saveLocation
  13.                 self.wb = opxl.Workbook()
  14.                 self.sheet = self.wb.active

  15.         def getLottery(self) :
  16.                 # 设置sheet页名称
  17.                 self.sheet.title = '彩票中奖号码'
  18.                 # 为Excel当前页添加标题栏
  19.                 self.sheet.append(['开奖日期', '期号', '中奖号码'])
  20.                 # 实际地址,经过浏览器捕捉,发现是这个地址后面带上页码再加上.html
  21.                 url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_'
  22.                 headers = {
  23.                         'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'
  24.                 }
  25.                 for i in range(8, 16) :
  26.                         realURL = url + str(i) + '.html'
  27.                         response = requests.get(realURL, headers = headers)
  28.                         content = etree.HTML(response.text)
  29.                         # 这里是以表格来排布,前两行是表头,无需抓取,
  30.                         # 从第三行到倒数第二行为开奖信息,这里用循环处理
  31.                         for j in range(3, 23) :
  32.                                 # 初始化各信息所在的具体位置,为获取信息复用
  33.                                 # 初始化临时列表,后续用作写入Excel
  34.                                 label_td, tempList = 1, []

  35.                                 # 获取开奖日期、期号和中奖号码的标签位置
  36.                                 lotteryDatePath = "/html/body/table/tr[" + str(j) + "]/td[" + str(label_td) + "]/text()"
  37.                                 dateNumPath = "/html/body/table/tr[" + str(j) + "]/td[" + str(label_td + 1) + "]/text()"
  38.                                 ballNumPath = "/html/body/table/tr[" + str(j) + "]/td[" + str(label_td + 2) + "]/em/text()"

  39.                                 # 获取各标签位的内容
  40.                                 lotteryDate = content.xpath(lotteryDatePath)[0]
  41.                                 dateNum = content.xpath(dateNumPath)[0]
  42.                                 ballNum = content.xpath(ballNumPath)
  43.                                 realBallNum = ' '.join(ballNum)

  44.                                 # 数据临时装载,为写入Excel做准备
  45.                                 tempList.append(lotteryDate)
  46.                                 tempList.append(dateNum)
  47.                                 tempList.append(realBallNum)

  48.                                 # 写入Excel
  49.                                 self.sheet.append(tempList)

  50.                         # 为防止网站禁用 IP,没抓取一页,休眠3到5秒
  51.                         time.sleep(random.randint(3, 5))

  52.                 # 保存Excel,并将其关闭
  53.                 self.wb.save(self.saveLocation)
  54.                 self.wb.close()
  55.                 del tempList
  56.                 print("Excel写入完毕!")


  57. if __name__ == "__main__" :
  58.         # 设置保存路径
  59.         saveLocation = r'C:\Users\Administrator\Desktop\彩票.xlsx'
  60.         lc = lottery(saveLocation)
  61.         lc.getLottery()
复制代码


怕楼主不知道逻辑,所以注释写的很啰嗦,如果网站没有封锁 IP 的风险,那么休眠那一行可以去掉,time 库和 random 库也可以不要

图片也在本楼的回复里,可以查看效果。
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 15:10:01 From FishC Mobile | 显示全部楼层
请问高手foxiangzun上面的日期在哪里体现?
如果只需要2018年1月1日至2018年10月28日的开奖数据如何更改。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 16:22:47 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-24 17:03:59 | 显示全部楼层
zhongyong6899 发表于 2019-12-24 16:22
请求高手foxiangzun及时回复,万分感谢!

两种方法,一种是在获取日期后,将日期转化成 Python 的日期格式,然后用 if 条件来判断就行了;另一种是直接将日期字段获取到后,以字符串进行分片然后判断,或者干脆将日期里的“-”去掉,然后比较大小就行了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 17:10:09 From FishC Mobile | 显示全部楼层
或者干脆将日期里的“-”去掉,然后比较大小就行了。具体改哪一行,如何改?请详细程序。万分感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-25 08:51:08 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-25 13:57:58 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-25 16:31:29 | 显示全部楼层
不知道楼主想知道这个的主要目的是什么,如果只是要数据,完全可以用上面的程序跑下来,在再EXCEL里处理,如果是想学习如何处理日期,for i in range(8, 16)  这个已经是设定了18年的大概范围,随着时间的增加,这个数据会变,要精确到你想要的日期,就只有在数据采完后,再进一步加工,tempList 生成完后,用pandas弄吧,要简单些。我只晓得思路,具体代码一时弄不出来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-26 16:13:55 From FishC Mobile | 显示全部楼层
或者干脆将日期里的“-”去掉,然后比较大小就行了。具体改哪一行,如何改?请详细程序。万分感谢。请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-27 15:45:07 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-27 17:22:47 | 显示全部楼层
foxiangzun 发表于 2019-12-24 14:39
怕楼主不知道逻辑,所以注释写的很啰嗦,如果网站没有封锁 IP 的风险,那么休眠那一行可以去掉,time  ...

厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 13:52:51 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-2 10:04:36 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-14 09:48:38 From FishC Mobile | 显示全部楼层
请求高手foxiangzun及时回复,万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-14 23:36:53 | 显示全部楼层
我看楼主一直在问,我帮你简单把 foxiangzun 的代码完善下吧
  原代码中for i in range(8, 16) : 修改为 for i in range(8, 17) : 不然2018年数据取不完。
  # 写入Excel
  self.sheet.append(tempList)
修改为:
# 写入Excel
data_temp=int(tempList[0].replace("-",""))  #将日期中的“-”去掉,转换为数值型。
if 20180101<data_temp<20181028:   #比较日期
    self.sheet.append(tempList)           #将范围内的数据写入表格
其它都不变,就可以达到你想要的效果了

评分

参与人数 1荣誉 +5 收起 理由
chenxueyuen + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 11:38:56 From FishC Mobile | 显示全部楼层
# coding=utf-8

'''
福利彩票,抓取2018年全年中奖号码
'''

import requests
import time
import random
import openpyxl as opxl
from lxml import etree

class lottery() :
        def __init__(self, *avgr):
                self.saveLocation = saveLocation
                self.wb = opxl.Workbook()
                self.sheet = self.wb.active

        def getLottery(self) :
                # 设置sheet页名称
                self.sheet.title = '彩票中奖号码'
                # 为Excel当前页添加标题栏
                self.sheet.append(['开奖日期', '期号', '中奖号码'])
                # 实际地址,经过浏览器捕捉,发现是这个地址后面带上页码再加上.html
                url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_'
                headers = {
                        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'
                }
                for i in range(8, 16) :
                        realURL = url + str(i) + '.html'
                        response = requests.get(realURL, headers = headers)
                        content = etree.HTML(response.text)
   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 11:45:31 From FishC Mobile | 显示全部楼层
data_temp=int(tempList[0].replace("-",""))  #将日期中的“-”去掉,转换为数值型。
if20180101<data_temp<20181028:   #比较日期
    self.sheet.append(tempList)           #将范围内的数据写入表格

具体在哪里改?万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-11 10:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表