初學python,寫了一個爬取歷史雙色球開獎記錄的程序。希望大家互相交流學習
1.找到數據的入口
百度一下雙色球歷史開獎記錄,出來許多網站,找到可以查看歷史記錄的網站就行,我這裏找到的是
http://kaijiang.500.com/ssq.shtml
裏面看歷史記錄的入口是下拉框,只要爬取出下拉框裏的地址,就知道歷史的記錄了。
2.爬取所有歷史記錄的地址
import requests
import LoadHistoryTask
#這個是代理,公司內網無法直接訪問,正常是不需要的
proxy_dict = {
"http": "http://****:****@proxy.****.com:8080/",
"https": "http://****:****@proxy.****.com:8080/"
}
#獲取頁面內容
homePage = requests.get("http://kaijiang.500.com/ssq.shtml", proxies=proxy_dict)
homePage.encoding = "gb2312"
pageStr = homePage.text
#解析頁面裏下拉框選項裏的地址,並放入list中
pageStr = pageStr[pageStr.find('<div class="iSelectList">'):]
historyArr = pageStr[len('<div class="iSelectList">'):pageStr.find('</div>')].split('</a><a')
3.遍歷地址爬取開獎數據
for i in range(0, len(historyArr)):
url = historyArr[i].split('"')[1]
seq = url[url.find('ssq')+4:-6]
if seq[0:2] in years:
continue
else:
years.append(seq[0:2])
LoadHistoryTask.getMessByIndex(seq)
這裏將每年的數據存入到了一個文件中,爬取中獎號碼的代碼如下、
import requests import re proxy_dict = { "http": "http://****:****@proxy.****.com:8080/", "https": "http://****:****@proxy.****.com:8080/" } def getMessByIndex(index): lines = [] for i in range(int(index), int(index) - int(index) % 1000, -1): try: s = str(i) if i < 10000: s = '0' + s everyPage = requests.get('http://kaijiang.500.com/shtml/ssq/%s.shtml' % (s), proxies=proxy_dict) everyPage.encoding = "gb2312" partStart = everyPage.text[everyPage.text.find('class="kj_tablelist02"'):] partMain = partStart[:partStart.find('</table>')] index = partMain[partMain.find('<strong>'):partMain.find('</strong>')].replace('<strong>', '') print('雙色球第', index, '期') checkOutDate = partMain[partMain.find('class="span_right">'):partMain.find('</span></td>')] checkOutDate = checkOutDate[len('class="span_right">'):checkOutDate.find(' 兌獎')].replace('開獎日期:', '') dateArr = [int(s) for s in re.findall(r'\d+', checkOutDate)] print('開獎日期:', dateArr) numbersArr = partMain[partMain.find('<li'):partMain.find('</ul>')].split('</li>') ballArr = [] for j in range(0, len(numbersArr) - 1): ballArr.append(int(numbersArr[j].split('>')[1])) print('開獎號碼', ballArr) ballOrderStr = partMain[partMain.rfind('<td>'):partMain.rfind('</td>')].replace('<td>', '').lstrip() print('出球順序', ballOrderStr) lines.append(index + '-' + str(ballArr) + '-' + str([int(a) for a in ballOrderStr.split(' ')]) + '-' + str( dateArr) + '\n') print('-----------------') except: pass with open("record%s" % index[0:2], "w", encoding='utf-8') as f: f.writelines(lines)