同步所有双色球历史数据脚本代码

如果要做一些数据上的处理,需要获取数据源。 比如处理双色球数据, 就要下载所有双色球的历史数据。但是人工下载是很慢的。所有我们这里使用python脚本进行爬取历史数据。

1,首先写好程序入口:

if __name__ == '__main__':

SyncHistory().sync()

2,然后是定义好进行爬取的类:

class SyncHistory(object):

'''

爬取彩票双色球的历史数据

'''

def __init__(self):

pass

确定一下数据源, 我们经过检索发现此网站的所有历史数据有比较规范的格式,能用脚本轻易的获得。主要是主页里面可以获取有哪些历史数据(即期数数据)。 然后也有可以访问具体每一期的具体数据。

http://kaijiang.500.com/ssq.shtml

3, 分析一下获取分为两个大步骤, 第一是获取有哪些历史数据可以获取, 所以定义了一个函数专门做此事:

def __getAllItems(self, url='http://kaijiang.500.com/ssq.shtml'):

'''

get all the item numbers

'''

try:

content = urllib2.urlopen(url).read()

contentTemp = content.split('kjxq_box02_title_right')[1]

contentTemp = contentTemp.split('kj_tablelist02')[0]

contentTemp = contentTemp.split('')

print "------------"

print len(contentTemp)

sleep(3)

matchItems = []

for oneline in contentTemp:

match = re.search(r'http://kaijiang.500.com/shtml/ssq/(.*?).shtml', oneline)

if match:

matchItems.append(match.group(1))

print match.group(1)

content = ''

contentTemp = []

print len(matchItems)

return matchItems

except Exception, e:

print "parse all the item error:", e

return []

4, 然后就是获取具体每一期的具体数据,用一个函数专门做此事:

def __getRBbollnum(self, url):

'''

parser of red blue number

'''

try:

print url

bluebollnum = 1

redbollnum = []

content = urllib2.urlopen(url).read()

contentTemp = content.split('ball_blue')[1].split('link537')[0]

# 解析篮球

bluematch = re.match(r'\\">(.*?)', contentTemp)

if bluematch:

print bluematch.group()

bluebollnum = int(bluematch.group(1))

print bluebollnum

#即系红球

redmatch = re.search(r'(\\d\\d.*?) (\\d\\d.*?) (\\d\\d.*?) (\\d\\d.*?) (\\d\\d.*?) (\\d\\d.*?)', contentTemp)

if redmatch:

print redmatch.group()

redbollnum.append(int(redmatch.group(1)))

redbollnum.append(int(redmatch.group(2)))

redbollnum.append(int(redmatch.group(3)))

redbollnum.append(int(redmatch.group(4)))

redbollnum.append(int(redmatch.group(5)))

redbollnum.append(int(redmatch.group(6)))

print redbollnum

return redbollnum, bluebollnum

except Exception, e:

print "parse red blue num error:", e

return [], 1

5, 最后就是一个具体的controller函数, 把所有数据获取下来存储到本地文件中:

def sync(self):

'''

同步所有双色球历史数据,

数据存储在运行目录下的文件中:red_blue_real_history_data.db

文件存储格式: [期数]xx红球1 xx红球2 xx红球3 xx红球4 xx红球5 xx红球6 +xx篮球

'''

matchItems = self.__getAllItems('http://kaijiang.500.com/ssq.shtml')

#matchItems = ['17084']

if len(matchItems) == 0:

print "have no correct items, so exit now"

return

try:

for item in matchItems:

redbollnum, bluebollnum = self.__getRBbollnum('http://kaijiang.500.com/shtml/ssq/'+str(item)+'.shtml')

if len(redbollnum) == 6:

try:

output = open('red_blue_real_history_data.db', 'a+')

writeLine = "[" + str(item) + "]"

for num in redbollnum:

writeLine = writeLine + str(num) + " "

writeLine = writeLine + "+" + str(bluebollnum) + "\\n"

print "---------> ", writeLine

output.write(writeLine)

except Exception, e:

print "operate file error:%s"%e

finally:

if output != None:

output.close()

sleep(random.randint(1, 10))#随机间隔时间后再访问下一组数据,以防数据源处做了访问限制

else:

print "parse red boll had error"

print "ALL THE HISTORY DATA SYNC DONE"

except Exception, e:

print "sync red blue number error:", e

return

以上5个步骤就可以把所有双色球数据获取到本地。 下一步就是进行数据分析和学习。


分享到:


相關文章: