Skip to content

用Python爬取双色球开奖信息(升级版)

《用Python简单爬取双色球开奖信息》中,完成了初始的爬取工作,但定时爬取的方法会爬取很多重复的数据,我们希望更精准更自动地去爬取。通过研究发现,中国福利彩票双色球每周二、四、日21:15开奖,中国体育彩票超级大乐透每周一、三、六21:30开奖,那么这次升级版的目标就是:

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

再次声明,注意合法性:

  • 只爬公开、非敏感、非版权数据
  • 不突破防护、不干扰运营、遵守robots.txt规则
  • 仅供学习使用

工具

  • python2.7
  • 一台debian 8.2的服务器

具体方法

使用python2.7编写爬取脚本

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

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

python
# -*- 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内容:

python
# -*- 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/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')

编写一个执行的sh脚本

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

shell
#!/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

编写一个主sh脚本

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

shell
#!/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!"

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

完整代码

完整的项目代码lotterygrabber已经上传到github上去了,欢迎提交watch、star、fork素质三连和提交issue。

转载请注明出处https://bananaoven.com/articles/196.html | 香蕉微波炉
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。