美文网首页轮子工厂计算机微刊程序员
用Python爬取双色球开奖信息,了解一下

用Python爬取双色球开奖信息,了解一下

作者: 在北方玩弹子球 | 来源:发表于2018-09-16 09:51 被阅读5次

    通过研究发现,中国福利彩票双色球每周二、四、日21:15开奖,中国体育彩票超级大乐透每周一、三、六21:30开奖,而我们要完成的目标是:

    1、自动完成安装工作

    2、在周二、四、日的晚上23:00爬取中国福利彩票双色球开奖数据,在周一、三、六的晚上23:00爬取中国体育彩票超级大乐透开奖数据。

    1、工具

    image

    2、具体方法

    1、使用python2.7编写爬取脚本

    这里除了正常的爬取操作,还增加了独立的参数设定。如果没有参数,爬取的数据就在当前目录下;如果有参数,可以设定保存目录、保存文件名后缀。这样的话,这个脚本既可以单独使用,也可以配合sh定时任务使用。

    双色球爬取代码grab500_ssq.py内容:

    # -*- coding:utf-8 -*-
    import re
    import urllib
    import time
    import sys
    
    datapath = sys.path[0]
    datasuffix = 'txt'
    if (len(sys.argv)>1):
        datapath = sys.argv[1]
        datasuffix = sys.argv[2]
    
    def getHtml(url):
        html = urllib.urlopen(url)
     return html.read()
    
    html = getHtml("http://zx.500.com/ssq/")
    
    reg = ['<dt>([0-9]\d*).*</dt>']
    reg.append('<li class="redball">([0-9]\d*)</li>')
    reg.append('<li class="blueball">([0-9]\d*)</li>')
    
    outstr = "";
    for i in range(len(reg)):
        page = re.compile(reg[i])
        rs = re.findall(page,html)
     for j in range(len(rs)):
            outstr+= rs[j] + ","
    
    #print time.strftime('%Y-%m-%d',time.localtime(time.time()))+":"+outstr[:-1]
    
    with open(datapath+'/lot_500_ssq.'+datasuffix, 'a') as f:
        f.write(time.strftime('%Y-%m-%d',time.localtime(time.time()))+":"+outstr[:-1]+'\n')
    
    

    大乐透爬取代码grab500_dlt.py内容:

    # -*- coding:utf-8 -*-
    import re
    import urllib
    import time
    import sys
    
    datapath = sys.path[0]
    datasuffix ='txt'
    if(len(sys.argv)>1):
        datapath = sys.argv[1]
        datasuffix = sys.argv[2]
    defgetHtml(url):
        html = urllib.urlopen(url)
    return html.read()
    html = getHtml("http://zx.500.com/dlt/")
    reg =['<dt>([0-9]\d*).*</dt>']
    reg.append('<li class="redball">([0-9]\d*)</li>')
    reg.append('<li class="blueball">([0-9]\d*)</li>')
    outstr ="";
    for i in range(len(reg)):
        page = re.compile(reg[i])
        rs = re.findall(page,html)
    for j in range(len(rs)):
            outstr+= rs[j]+","
    #print time.strftime('%Y-%m-%d',time.localtime(time.time()))+":"+outstr[:-1]
    with open(datapath+'/lot_500_dlt.'+datasuffix,'a')as f:
        f.write(time.strftime('%Y-%m-%d',time.localtime(time.time()))+":"+outstr[:-1]+'\n')
    
    

    2、编写一个执行的sh脚本

    我们需要编写执行python的sh脚本bwb_lottery_everyday.sh,要注意的是sh的date获取的星期天值是0而不是7,而crontab则可以设定0或者7。

    #!/bin/sh
    basepath=$(cd `dirname $0`; pwd) #shell's dir
    datapath=$basepath'/lotterydata' #shell's datadir
    datasuffix='txt' #datasuffix
    
    a=`date -d "${date}" +%w`
    if [ $a -eq 1 ] || [ $a -eq 3 ] || [ $a -eq 6 ]; then
        python "${basepath}/grab500_ssq.py" $datapath $datasuffix
    elif [ $a -eq 2 ] || [ $a -eq 4 ] || [ $a -eq 0 ]; then
        python "${basepath}/grab500_dlt.py" $datapath $datasuffix
    fi
    
    

    3、编写一个主sh脚本

    编写一个主要的sh脚本bwb_lottery_main.sh,执行清理和设定的工作。需要注意的是,这里直接使用了系统的/etc/crontab文件来达到周期执行的目的,其实并不太好,但crontab -e的方法很难自动化,所以只能设定为系统任务。

    #!/bin/sh
    cronfile="/etc/crontab" #debian cronfile
    basepath=$(cd `dirname $0`; pwd) #shell's dir
    datapath=$basepath'/lotterydata' #shell's datadir
    datasuffix='txt' #datasuffix
    crontaskname="bwb_lottery_everyday.sh" #shell's name
    crontasktime="0 23\t* * 1-4,6-7" #crontab task run time,default everyday except friday 23:00
    
    echo "checking..."
    if [ ! -f ${cronfile} ]; then 
        echo "crontab file $cronfile doesn't exsits.\nplease check file or modify shell setting and run shell again." 
        exit 1
    fi
    
    pyver=`python -V 2>&1|awk '{print $2}'|awk -F '.' '{print $1}'`
    if [ $pyver != '2' ]; then
        echo "python2(.7) is needed."
        exit 1
    fi
    
    echo "writing crontab file..."
    if [ `grep -c "${crontaskname}" ${cronfile}` -eq '0' ]; then
        echo "${crontasktime}\troot\t${basepath}/${crontaskname}">>${cronfile}
    else
        sed -i "s#^.*${crontaskname}.*#${crontasktime}\troot\t${basepath}/${crontaskname}#" ${cronfile}
    fi
    /etc/init.d/cron restart
    
    echo "making data dir..."
    if [ ! -d "${datapath}" ]; then
        mkdir ${datapath}
    else
     if [ ! -d "${datapath}/bak" ]; then
            mkdir "${datapath}/bak"
     else
            mv ${datapath}/*.${datasuffix} ${datapath}/bak/ 2>/dev/null
     fi
    fi
    
    echo "changing permission..."
    chmod +x "$basepath/$crontaskname"
    chmod +w -R $datapath
    
    echo "finished!"
    
    

    我们最后只需要执行这个主脚本,就能一键自动完成彩票爬虫的布置。

    完整的项目代码已经上传到github上去了~

    链接:

    https://github.com/BEWINDOWEB/lotterygrabber

    欢迎提交watch、star、fork素质三连和提交issue。

    --------------------------
    PS:码字不容易,如果对您有帮助的话,帮忙转发一下,谢谢啦~

    微信搜索公众号:轮子工厂

    会定期分享一些实用工具学习笔记~

    image.png

    相关文章

      网友评论

        本文标题:用Python爬取双色球开奖信息,了解一下

        本文链接:https://www.haomeiwen.com/subject/empxnftx.html