用luasocket读取双色球中奖号码

其实是蛮简单的一个功能,就是读取这个页面: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即可

转载于:https://www.cnblogs.com/baiyanhuang/archive/2012/11/25/2787697.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dedecms更改php目录名称,dedecms修改专题目录名称(路径)

织梦DEDECMS模板的默认专题路径是/special/织梦模板这个感觉还是有些长了&#xff0c;怎么自定义这个路径名称呢&#xff1f;比如我们需要改为/s/&#xff0c;我们可以使用下面的方法来修改&#xff1a;1、首先&#xff0c;我们找到文件/include/common.inc.php的139行&#xf…

linux 下zip文件的压缩和解压

压缩&#xff1a;zip 解压&#xff1a;unzip tar.gz 解压&#xff1a;tar -xvfz filename转载于:https://www.cnblogs.com/bjdxy/archive/2012/11/26/2789170.html

oracle中xml如何存储过程,oracle存储过程生成xml文件

oracle存储过程生成xml文件CREATE OR REPLACE PROCEDURE Pro_OracleToXML(personid varchar2,name varchar2,address varchar2,tel varchar2,ip varchar2,email varchar2)ASisql varchar2(200);--创建临时表dptable varchar2(100);--删除临时表i_insert varchar2(200);--将数据…

查看linux的用户

cat /etc/passwd |cut -f 1 -d :转载于:https://www.cnblogs.com/gaohuag/archive/2012/11/28/2792724.html

oracle查看列状态unused,Oracle9i下将列设为UNUSED时的系统行为

下面以例子说话&#xff1a;SQL> create table test1.unused_test as select rownum a,rownum*2 b,rownum*10 c from dba_objects where rownum<100;Table created.看看数据字典&#xff1a;SQL> select column_name,data_type,column_id,hidden_column,segment_colu…

前端学习(603):计算机基础

好久没有学习前端了&#xff0c;开始找找感觉

c++成员变量与构造函数

一、 如果成员变量是对象实体&#xff08;不是指针&#xff09; 例如StudyTool类中有一个Book类的成员变量&#xff0c;StudyTool的构造函数和析构函数均为空函数。 class StudyTool { public:Book book;StudyTool();virtual ~StudyTool();void printBook(); }; 那么在main()方…

oracle开启日志服务,Oralce 归档日志开启与关闭示例

查看oracle数据库是否为归档模式SQL> select name,log_mode from V$database;NAME LOG_MODE------------------ ------------------------TEST NOARCHIVELOGSQL> archive log listDatabase log mode No Archive ModeAutomatic archival DisabledArchive destination USE_…

网络抓包工具--网路岗

绿色压缩包下载下载 转载于:https://www.cnblogs.com/vilyLei/articles/2799400.html

windows cmd后ipconfig后提示不是内部命令或外部命令

出现这样的提示怎么办&#xff1f; cd c:\windows\system32后再次输入ipconfig发现可以使用了 总不能每次使用都cd一下吧&#xff0c;解决方法&#xff1a;在环境变量里&#xff0c;新添加一个Path 路径写c:/windows/system32&#xff0c;就ok了转载于:https://www.cnblogs.com…

php layui 上传文件,laravel使用layui 上传文件 支持pdf上传

控制器&#xff1a;file(file);//获取图片$allowed_extensions ["png", "jpg", "gif","pdf"]; //多类型//图片是否是正规图片if ($file->getClientOriginalExtension()&&!in_array($file->getClientOriginalExtension(…

STL 中map的用法详解

STL 中map的用法详解 Map是STL的一个关联容器&#xff0c;它提供一对一&#xff08;其中第一个可以称为关键字&#xff0c;每个关键字只能在map中出现一次&#xff0c;第二个可能称为该关键字的值&#xff09;的数据处理能力&#xff0c;由于这个特性&#xff0c;它完成有可能在…

php在线模拟高考志愿,高考志愿模拟填报系统

出国留学高考网为大家提供吉林省2018高考志愿模拟填报系统&#xff0c;更多高考资讯请关注我们网站的更新!吉林省2018高考志愿模拟填报系统填报时间5月26日至28日(每天09&#xff1a;00至15&#xff1a;00)。模拟范围取得吉林省2018年高考报名资格的统考考生。(一)登录模拟训练…

firefox addons

webrank searchstatus转载于:https://www.cnblogs.com/haven/archive/2012/12/08/2808388.html