其实是蛮简单的一个功能,就是读取这个页面:http://61.129.89.226/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=2012138, 把某一个期的中奖号码抽取出来。

【luarocks安装library】

首先,如果是想用某个库,真没必要自己wget再make, install啥的,太烦。lua社区提供了一个非常好用的工具,用法和apt(advanced package tools)很类似:

apt-cache search xxx
sudo apt-get install xxxluarocks search xxx
luarocks install xxx

这里需要luasocket,很简单:

$ luarocks search socket

Search results:
===============

Rockspecs and source rocks:
---------------------------

luasocket
2.0.2-5 (rockspec) - http://luarocks.org/repositories/rocks
2.0.2-5 (src) - http://luarocks.org/repositories/rocks
2.0.2-4 (rockspec) - http://luarocks.org/repositories/rocks
。。。。。。

$ luarocks install luasocket
Installing http://luarocks.org/repositories/rocks/luasocket-2.0.2-5.src.rock...
Archive: /tmp/luarocks_luarocks-rock-luasocket-2.0.2-5-2574/luasocket-2.0.2-5.src.rock
。。。。。。
cd src; cp mime.so.1.0.2 /home/baiyanh/.luarocks/lib/luarocks/rocks/luasocket/2.0.2-5/lib/mime/core.so
Updating manifest for /home/baiyanh/.luarocks/lib/luarocks/rocks

【读取页面】

然后用luasocket发送http get request,来获取web页面:

issuenum = arg[1]
if not issuenum thenerror "please provide the lottery issue num!"
endsocket = require "socket"host = '61.129.89.226'
port = 80
fileformat = '/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=%s'
starting = '开奖结果'
numpattern = '>%d%d<'function getlotterywinner(issuenum)local client = assert(socket.connect(host, port))client:send('GET ' .. string.format(fileformat, issuenum)  .. " HTTP/1.0\r\n\r\n")local line = client:receive('*l')local start = falselocal winner = {}while line doif line:find(starting) thenstart = trueendif start thenlocal num = line:match(numpattern)if num thentable.insert(winner, num:sub(2, -2))endendif #winner == 7 then break endline = client:receive('*l')endclient:close()return winner
end--http://61.129.89.226/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=2012138
winner = getlotterywinner(issuenum)
for _, v in ipairs(winner) doio.write(v .. "  ")
end
io.write("\n")

但遗憾的是,上述代码无法正确输出结果,事实上,上面“开奖结果”根本无法匹配 - 为什么?

【解决编码问题】

查看双色球网页的source,可以看到这么一行:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

该网页的编码是gb2312, 而我写在lua代码中的“开奖结果”,是和这个lua脚本采用同样的编码:utf8,所以无法匹配(他们在内存中的表示方式不同,匹配自然失败) - 知道了原因就好办了,只要把他们转成同样的编码即可:

  • 转码的方向 - 自然是把“开奖结果”转成gb2312最省钱
  • 用什么库 - lua提供了对iconv库的wrapper,叫lua-iconv

好,下载:

$ luarocks install lua-iconv
Installing http://luarocks.org/repositories/rocks/lua-iconv-7-1.src.rock...
Archive: /tmp/luarocks_luarocks-rock-lua-iconv-7-1-2223/lua-iconv-7-1.src.rock
inflating: lua-iconv-7-1.rockspec
extracting: lua-iconv-7.tar.gz
gcc -O2 -I/usr/include/lua5.1 -c luaiconv.c -o luaiconv.o -I/usr/include
gcc -shared -o iconv.so -L/usr/local/lib luaiconv.o -L/usr/lib
Updating manifest for /home/baiyanh/.luarocks/lib/luarocks/rocks

要熟悉iconv很简单,因为linux下自带了一个iconv的命令行工具,查看支持的编码:

$ iconv --list | grep "^GB"
GB//
GB2312//
GB13000//
GB18030//
GBK//
GB_1988-80//
GB_198880//

修改代码:

iconv = require "iconv"
cd = iconv.new('gb2312', 'utf8')
starting = cd:iconv('开奖结果')

运行:

$ lua getlotterywinner.lua 2012138
01 07 16 17 19 21 14

【玩点酷的】

下面用这个小程序做点有意思的事:查看03年以来蓝色球各个数字的概率,或许对指导我买彩票有一定的帮助(篮球中了,最少也有5块奖金了:))

历年每年的期数都不相同,但所有的期数都列在这个网页中了:http://61.129.89.226/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=2012138,所有只要拿到所有的期数,然后调用上面的函数得到中奖号码,统计一下就ok了:

function allissues()local client = assert(socket.connect(host, port))client:send('GET ' .. string.format(fileformat, 2012138)  .. " HTTP/1.0\r\n\r\n")local line = client:receive('*l')local issuepattern = '>%d%d%d%d%d%d%d<'return function ()while line dolocal issuenum = line:match(issuepattern)line = client:receive('*l')if issuenum thenreturn issuenum:sub(2, -2)endendreturn nilendendlocal data = {}
local count = 0
for issuenum in allissues() docount = count + 1print ("getting " .. issuenum .. "...")local winner = getlotterywinner(issuenum)local blue = tonumber(winner[7])if not data[blue] thendata[blue] = 0enddata[blue] = data[blue] + 1
endfor k, v in pairs(data) doprint(string.format("%2d: %3d/%d = %0.4f", k,  v, count, v/count))
end

最终结果:

1: 90/1423 = 0.0632
2: 88/1423 = 0.0618
3: 90/1423 = 0.0632
4: 78/1423 = 0.0548
5: 96/1423 = 0.0675
6: 85/1423 = 0.0597
7: 77/1423 = 0.0541
8: 76/1423 = 0.0534
9: 100/1423 = 0.0703
10: 86/1423 = 0.0604
11: 101/1423 = 0.0710
12: 90/1423 = 0.0632
13: 91/1423 = 0.0639
14: 91/1423 = 0.0639
15: 91/1423 = 0.0639
16: 93/1423 = 0.0654

看来挺平均的,11和9稍微高一点,但也就胜出零点几个百分点而已。。。

【下一步】

做个web service封装以下这个很hardcode的实现,这样如果人家网页的格式变了,或者编码编了,或者我想换个新的实现,都不会影响最终使用者 - 及时更新web service即可

用luasocket读取双色球中奖号码相关推荐

  1. 20190930双色球中奖号码概率的处理(VC6.0)

    20190930双色球中奖号码概率的处理(VC6.0) 2019/9/30 15:26 https://baike.baidu.com/item/中国福利彩票双色球/8676030?fromtitle ...

  2. python抓取每期双色球中奖号码,用于分析

    获取每期双色球中奖号码,便于观察,话不多说,代码如下 # -*- coding:utf-8 -*- # __author__ :kusy # __content__:获取每期双色球中奖号码 # __d ...

  3. 2017年双色球中奖号码

    网络爬虫,又称网页蜘蛛.网络机器人.随着计算机技术的高速发展,互联网中的信息量越来越大,搜索引擎应运而生.传统的搜索引擎会有返回结果不精确等局限性.为了解决传统搜索引擎的局限性,专用型网络爬虫在互联网 ...

  4. 优先处理我的问题,帮我编写获取双色球中奖号码的历史数据的python代码

    好的,以下是一个获取双色球中奖号码历史数据的Python代码示例,使用requests和BeautifulSoup库从网站上抓取数据: import requests from bs4 import ...

  5. 使用vb6.0编写的随机生成双色球中奖号码(预测)

    使用vb6.0编写的随机生成双色球中奖号码(预测) 2019/10/1 12:16 最近研究双色球,在网络上搜索到这里: http://blog.sina.com.cn/s/blog_4cd4ffc4 ...

  6. python获取历史双色球数据_你的梦想,我来买单!Python分析双色球中奖号码竟成功获取特等奖

    关于双色球的话题估计大家都听的很多,毕竟成本很低,但是收获很高.毕竟当利润达到100%时,就有人敢于铤而走险.当利润达到200%时,他们就敢于冒上断头台的危险. 而当利润达到300%他们就会践踏人间的 ...

  7. JAVA用一维数组生成福彩双色球中奖号码

  8. JAVA模拟福利彩票双色球(选号,判断是否中奖,以及中奖号码)

    一,双色球中奖规则(均不分顺序): 一等奖:6个红球+1个蓝球号码完全相同-奖金波动9000000元左右 二等奖:6个红球+0个蓝球号码相同-奖金波动150000元左右 三等奖:5个红球+1个蓝球号码 ...

  9. bs4爬虫:获取双色球中奖信息

    一.开发环境 (1)win10 (2)python 2.7 (3)pycharm 二.保存数据到excel的类 import xlwtclass SavaBallDate(object):def __ ...

最新文章

  1. Xilinx 学习笔记1---新建工程和创建源代码文件
  2. java发送qq邮箱不成功_java,_使用QQ邮箱发送邮件遇到的问题,java - phpStudy
  3. mysql迁移导致数据库效率低_MySQL数据库慢–排查问题总结(整理自《抽丝剥茧之MySQL疑难杂症排查》叶金荣)...
  4. Boost:timer计时器测试程序
  5. 有点香!苹果首次参加天猫618 iPhone/iPad全线降价
  6. SpringBoot+AOP构建多数据源的切换实践
  7. java创建动态数组_动态数组java实现
  8. centOS安装yasm
  9. 基于stm32f401的双按键可视化多模式选择模块
  10. python实现图片识别文字程序
  11. s1 Linux 硬件基础
  12. 盘点近些年成功的游戏联名营销
  13. 软件项目“免坑”指南
  14. 腾讯产品的创新“渐进式”
  15. android 日期格式 毫秒
  16. 高分一号(GF-1)卫星影像数据全色和多光谱信息介绍
  17. 你只需画草稿,剩下都交给AI!哈佛『机器学习』最新课程;Evernote收费又难用?试试这款开源工具;提示工程资源整合笔记;前沿论文 | ShowMeAI资讯日报
  18. arcmap实现洪水淹没分析
  19. PCB工艺设计规范-01
  20. 【深度学习】步态识别-论文笔记:(ICCV-2021)用于步态识别的3D局部卷积神经网络

热门文章

  1. swing开发五子棋
  2. 法规标准-ECE R79标准解读
  3. 数字证书连接服务器异常,连接时Socket.io + SSL +自签名CA证书出现错误
  4. AE粒子跟随手势特效
  5. Unity dotween YoYo循环
  6. 转盘游戏中计算机模拟实验,《转盘游戏》说课稿.doc
  7. zblog php 点赞,文章点赞开发版
  8. 如何用画图框住所选内容_我们知道您的住所-在线隐私之死
  9. 《构建之法》第一次作业
  10. 第五届蓝桥杯C/C++本科B组(真题试做)(9~10)