如果要做一些数据上的处理,需要获取数据源。 比如处理双色球数据, 就要下载所有双色球的历史数据。但是人工下载是很慢的。所有我们这里使用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个步骤就可以把所有双色球数据获取到本地。 下一步就是进行数据分析和学习。
閱讀更多 卜溪大人 的文章