利用Python實現爬去彩票網站數據——小樣
寫這篇文章純屬自娛自樂。
主要是近期在自學如何利用Python解決IT運維的一些問題時,總是不得其門而入,為了增加學習興趣,就想通過完成一個小小有趣的爬蟲程序激勵下自己,同時也把這次經歷跟各位道友分享下。
Technorati Tags: Python,爬網,彩票,數據,夏明亮首先申明,本人不是專職coding的,所以,代碼部分如果不符合專業審美,還請多多包涵;俺就是純粹以實習那目標為基礎的小白一枚;思路為先,拋磚引玉~
步驟一:利用搜索引擎找到你需要的信息的網頁資源
1. 打開百度搜索”彩票網”
第一個鏈接就是中彩網的官網;打開網站;在導航欄找到雙色球並打開鏈接。
再找到開獎數據
找到往期回顧。
可以看到這就是我們需要獲取的信息。
步驟二:分析網頁源代碼。
在網頁上右擊——>查看源代碼或者直接按F12鍵。
借助瀏覽器我們很方便就可以得到網頁的源碼及網頁中顯示的數據對應的原始值。
接下來我們再看這個網頁是不是就是簡簡單單的純靜態頁面呢?怎麽看呢?
1. 當前頁面的網址(www.zhcw.com/ssq/kaijiangshuju/#)
2. 我們再點擊下這個頁面的下面幾個位置
3. 看到其實他們的網址是不變的(www.zhcw.com/ssq/kaijiangshuju/#);這說明了什麽?說明這些內容其實是嵌套在網頁中網頁文件。
那麽問題來了?如何能獲得嵌套網頁的真實網址呢?這裏我們還是要借助我們的瀏覽器工具(開發者工具F12)
先F12;找到Network;再單擊頁面山的“往期回顧”
得到這些交互數據:
憑經驗(如果無經驗或者經驗不足,那就逐個文件查看)看這個list.html文件可能就是包含數據的最終文件了;查看該文件的預覽。
哎呦,不錯哦,猜中了;再看下上面途中第二個方框的Request URL部分的網址;這就是這個網頁的真實網址了。
在瀏覽器打開這個網址試試看:
到這裏我們才是真正的開始。
不妨我們隨便單擊下一頁看看:
上一頁
仔細看看網址的變化我們不妨大膽猜想下我們需要的數據是存放在以下internet路徑上的:網址+_+頁碼+.html中。
驗證下試試看,當前我這裏顯示有113頁,不妨我試下訪問:http://kaijiang.zhcw.com/zhcw/html/ssq/list_113.html
猜中了。
那接下來就按照這個真實的網址來抓取數據吧。
步驟三:利用瀏覽器的開發者工具分析源碼
我們需要的數據是存放在:
<table>標簽下的第4個以後的<tr>標簽下;標簽中包含:開獎日期/期號/藍色中獎號碼/紅色中獎號碼等信息。
步驟四:編寫python代碼
代碼示例:
#!python3
import requests,bs4
def GetWinningInfo(webaddress):
res = requests.get(webaddress).text
htmlinfo = bs4.BeautifulSoup(res,‘html.parser‘)
resultinfo_qishu = htmlinfo.select(‘td‘)
resultinfo_haoma = htmlinfo.select(‘em‘)
#包括每一期的期號;開獎日期等信息
resultinfo_haomalist = str(resultinfo_haoma).replace(‘<em class="rr">‘,‘‘).replace(‘</em>‘,‘‘).replace(‘<em>‘,‘‘).replace(‘[‘,‘‘).replace(‘]‘,‘‘).split(‘,‘)
print(len(resultinfo_qishu))
for i in range(0,len(resultinfo_qishu)-1,7):
for j in range(0,2):
if j == 0:
print(‘開獎日期:‘ + str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘))
else:
print(‘期 號:‘ + str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘))
x = []
for n in range(0,7):
x.append(resultinfo_haomalist[i+n])
print(‘紅色球:%s,%s,%s,%s,%s,%s;藍色球:%s‘ % (x[0],x[1],x[2],x[3],x[4],x[5],x[6]))
#main
#TODO:獲取總的頁碼數量
GetWinningInfo(‘http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html‘)
上面的代碼目前僅實現了對第一頁數據的正確獲取並將獲取的結果顯示在屏幕上;到這裏,本項目依然對現實生活起不到任何作用;當然除了給在座各位技術死宅們一絲絲竊喜~~~
因此,為了能讓大多數人從本程序中的獲益並由衷贊賞我們的超能力,我們還需要想的更多,做的更好。
例如:讀取往期全部數據;將讀取的數據保存在excel中;再對數據進行一些符合人類邏輯的分析,將分析結果展現在圖表中等等……
步驟四:那我們就開動吧
首先我們實現抓取全部往期數據:
示例二:
#!python3
import requests,bs4
def GetWinningInfo(webaddress):
res = requests.get(webaddress).text
htmlinfo = bs4.BeautifulSoup(res,‘html.parser‘)
resultinfo_qishu = htmlinfo.select(‘td‘)
resultinfo_haoma = htmlinfo.select(‘em‘)
#包括每一期的期號;開獎日期等信息
resultinfo_haomalist = str(resultinfo_haoma).replace(‘<em class="rr">‘,‘‘).replace(‘</em>‘,‘‘).replace(‘<em>‘,‘‘).replace(‘[‘,‘‘).replace(‘]‘,‘‘).split(‘,‘)
print(len(resultinfo_qishu))
issuerDatas = []
for i in range(0,len(resultinfo_qishu)-1,7):
issuerData = []
for j in range(0,2):
if j == 0:
#print(‘開獎日期:‘ + str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘))
a = str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘)
issuerData.append(a)
else:
#print(‘期 號:‘ + str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘))
b = str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘)
issuerData.append(b)
x = []
for n in range(0,7):
x.append(resultinfo_haomalist[i+n])
#print(‘紅色球:%s,%s,%s,%s,%s,%s;藍色球:%s‘ % (x[0],x[1],x[2],x[3],x[4],x[5],x[6]))
issuerData.append(x)
issuerDatas.append(issuerData)
return issuerDatas
#main
#TODO:獲取總的頁碼數量
numberOfPages = 113 #如果有興趣可以嘗試將這個數字也從網站中獲取。
baseWebAddress = "http://kaijiang.zhcw.com/zhcw/html/ssq"
for e in range(1,numberOfPages+1):
print(‘--------這是第%s頁--------‘ % e)
realWebAddress = baseWebAddress + ‘/list_‘+ str(e) + ‘.html‘
resultall = GetWinningInfo(realWebAddress)
for everyIssuerData in resultall:
#print(everyIssuerData)
print(‘【開獎日期】:%s‘ % everyIssuerData[0])
print(‘【期 號】:%s‘ % everyIssuerData[1])
print(‘【中獎號碼】‘)
print(‘紅色球:%s,%s,%s,%s,%s,%s;藍色球:%s‘ % (everyIssuerData[2][0],everyIssuerData[2][1],everyIssuerData[2][2],everyIssuerData[2][3],everyIssuerData[2][4],everyIssuerData[2][5],everyIssuerData[2][6]))
以上代碼實現了將往期所有開獎歷史信息獲取並打印到屏幕上的功能;接下來我們實現將獲取的數據寫入文件。
在開始下一步之前大家選需要掌握一些基礎的python操作Excel文件的方法;這裏我們加一個小插曲;一起學習下這方面的內容。(那我們就另加一個步驟吧。)
步驟五:學學怎麽使用Python操作Excel(插曲)
學習用Python處理Excel文件,這裏主要用xlrd和xlwt模塊,用前需要安裝!一般就是要pip安裝。(這個不會嗎?那去查查谷歌吧。)
xlrd(excel read)來讀取Excel文件,使用xlwt(excel write)來生成Excel文件(可以控制Excel中單元格的格式),需要註意的是,用xlrd讀取excel是不能對其進行操作的:xlrd.open_workbook()方法返回xlrd.Book類型,是只讀的,不能對其進行操作。而xlwt.Workbook()返回的xlwt.Workbook類型的save(filepath)方法可以保存excel文件。
因此對於讀取和生成Excel文件都非常容易處理,但是對於已經存在的Excel文件進行修改就比較麻煩了。不過,還有一個xlutils(依賴於xlrd和xlwt)提供復制excel文件內容和修改文件的功能。其實際也只是在xlrd.Book和xlwt.Workbook之間建立了一個管道而已。
PS: xlwt、wlrd只能讀寫xls文件,而不能操作xlsx文件(道聽途說,本人沒有試過,想必是不會錯的)
因此,我們需要用到openpyxl;安裝非常簡單也是用pip。(openpyxl只能操作xlsx文件而不能操作xls文件)
如果你還有圖表的需求,那麽你可以安裝xlsxwriter庫。
Python就是強大,兵器庫已經由前輩們造好了;你只需要選擇最合適的兵器;然後讀一下使用說明;分分鐘練就絕世神功;當然這個只適合速成班的同學們,真正要成為編程界的一代宗師,還是需要認真學學如何打造自己的趁手神兵的。
再輔一個差異對比的鏈接吧。
http://www.gocalf.com/blog/python-read-write-excel.html
https://zhuanlan.zhihu.com/p/23998083
我們先來看幾個關於Excel的概念:
workbook: 每一個Excel文件就是一個workbook。
sheet: 每一個workbook中可以包含多個sheet,對應Excel中我們在左下腳所看到的“sheet1”,“sheet2”等。
cell: 每一個sheet就是我們通常所看到的一個表格,可以含有許多行和列,每個確定的行號,列號所對應的一個格子就是一個cell。
那麽我就隨便選擇一個兵器:xlsxwriter(這貨不能打開和修改現有的excel文件);雖然功能缺失了一些,但是應對我當前的需求足夠了。
關於這個模塊的深入學習,請參考這裏:https://xlsxwriter.readthedocs.io/
首先是安裝這個模塊:pip install xlsxwriter
接下來嘗試編寫一個小小的腳本創建一個excel文件並在其中寫入一些簡單的數據。
下面給一個示例:
#!python3
import xlsxwriter
#本示例主要實現Excel文件的基本操作
#創建Excel文件
workbook = xlsxwriter.Workbook(‘testexcel.xlsx‘)
worksheet = workbook.add_worksheet(‘TEST‘)
workbook.close()
#讀取現有的EXCEL文件的功能xlsxwriter模塊無此功能,因此這裏創建的文檔和上面的不一樣
workbook = xlsxwriter.Workbook(‘testexcel.xlsx‘)
worksheet = workbook.add_worksheet(‘TEST‘)
#設置列寬
worksheet.set_column(‘A:A‘,40)
worksheet.set_row(0, 40)
#自定義格式
bold = workbook.add_format({‘bold‘:True})
a = workbook.add_format({‘font_size‘: 26, ‘bold‘: True, ‘align‘: ‘left‘,‘bg_color‘: ‘cccccc‘})
b = workbook.add_format({‘border‘: 1, ‘font_size‘: 13, ‘bold‘: True, ‘align‘: ‘center‘,‘bg_color‘: ‘ccccc0‘})
worksheet.write(‘C1‘, "python excel")
worksheet.strings_to_urls
worksheet.write_row(‘H1‘,[‘X‘,‘X‘,‘X‘],b)
worksheet.write_row(‘H2‘,[‘X‘,‘X‘,‘X‘],b)
worksheet.write_row(‘H3‘,[‘X‘,‘X‘,‘X‘],b)
worksheet.write_row(‘H4‘,[‘X‘,‘X‘,‘X‘],b)
worksheet.write_row(‘H5‘,[‘X‘,‘X‘,‘X‘],b)
worksheet.write_row(‘H6‘,[‘X‘,‘X‘,‘X‘],b)
#A1單元格寫入數據
worksheet.write(‘A1‘,‘Hello‘)
#B1單元格寫入數據並加粗
worksheet.write(‘B1‘,‘World‘,bold)
#A2單元格寫入數據並加粗
worksheet.write(‘A2‘,‘歡迎使用Python!‘,bold)
#另一種形式寫入數據
worksheet.write(2,0,20)
worksheet.write(3,0,111.205)
#寫入公式
worksheet.write(4,0,‘=SUM(A3:A4)‘)
#插入圖片
worksheet.insert_image(‘A10‘, ‘11_test001.jpg‘)
worksheet.insert_image(‘A10‘, ‘11_test001.jpg‘, {‘url‘: ‘https://www.python.org/‘})
workbook.close()
有了以上這些最基礎的知識以後,我們就可以繼續去實現我們的想法了。
步驟六:將抓取的數據寫入EXCEL文件,並做簡單的圖表分析
上面是一些題外話,下面進入正題;我們將在程序中添加代碼,實現將抓取的數據寫入EXCEL文件的目的,並且文件的命名方式為按照主題+日期的方式。
真實的環境下我們爬去數據不僅僅是為了拿而拿;關鍵還是的從數據中篩選分析出有用的信息。
直接上代碼吧:
#!python3
import requests,bs4,xlsxwriter,time
#環境運行基礎數據定義
#**********************************************************************
scriptRuningTime = time.strftime("%Y%m%d_%H%M%S", time.localtime())
outFileName = ‘LotteryHistoryDataList_‘ + scriptRuningTime + ‘.xlsx‘
baseWebAddress = "http://kaijiang.zhcw.com/zhcw/html/ssq"
#函數定義
#**********************************************************************
def GetWinningInfo(webaddress):
res = requests.get(webaddress).text
htmlinfo = bs4.BeautifulSoup(res,‘html.parser‘)
resultinfo_qishu = htmlinfo.select(‘td‘)
resultinfo_haoma = htmlinfo.select(‘em‘)
#包括每一期的期號;開獎日期等信息
resultinfo_haomalist = str(resultinfo_haoma).replace(‘<em class="rr">‘,‘‘).replace(‘</em>‘,‘‘).replace(‘<em>‘,‘‘).replace(‘[‘,‘‘).replace(‘]‘,‘‘).split(‘,‘)
#print(len(resultinfo_qishu))
issuerDatas = []
for i in range(0,len(resultinfo_qishu)-1,7):
issuerData = []
for j in range(0,2):
if j == 0:
#print(‘開獎日期:‘ + str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘))
a = str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘)
issuerData.append(a)
else:
#print(‘期 號:‘ + str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘))
b = str(resultinfo_qishu[i+j]).replace(‘<td align="center">‘,‘‘).replace(‘</td>‘,‘‘)
issuerData.append(b)
x = []
for n in range(0,7):
x.append(resultinfo_haomalist[i+n])
#print(‘紅色球:%s,%s,%s,%s,%s,%s;藍色球:%s‘ % (x[0],x[1],x[2],x[3],x[4],x[5],x[6]))
issuerData.append(x)
issuerDatas.append(issuerData)
return issuerDatas
#main
#**********************************************************************
#TODO:獲取總的頁碼數量
numberOfPages = 113 #如果有興趣可以嘗試將這個數字也從網站中獲取。
#創建Excel文件並寫入表頭
workbook = xlsxwriter.Workbook(outFileName)
worksheet = workbook.add_worksheet(‘Lottery‘)
worksheet.hide_gridlines(2)
tableHeader = ["NO.","開獎日期","期 號","紅球1","紅球2","紅球3","紅球4","紅球5","紅球6","藍球1",]
a = workbook.add_format({‘border‘: 1, ‘font_size‘: 20, ‘bold‘: True, ‘align‘: ‘center‘,‘bg_color‘: ‘ccccc0‘})
b = workbook.add_format({‘border‘: 1, ‘font_size‘: 13,‘align‘: ‘left‘,‘bg_color‘: ‘5F9EA0‘})
c = workbook.add_format({‘border‘: 1, ‘font_size‘: 13,‘align‘: ‘left‘,‘bg_color‘: ‘D2B48C‘})
worksheet.write_row(‘A1‘, tableHeader,a)
#開始逐個網頁爬取數據
i = 0
for e in range(1,numberOfPages+1):
print(‘--------這是第%s頁--------‘ % e)
realWebAddress = baseWebAddress + ‘/list_‘+ str(e) + ‘.html‘
resultall = GetWinningInfo(realWebAddress)
for everyIssuerData in resultall:
i = i + 1
cellPos1 = ‘A‘ + str(i+1)
cellPos2 = ‘B‘ + str(i+1)
#小細節把抓取的數據寫入前轉換成數字格式
cellValue = [everyIssuerData[0],int(everyIssuerData[1]),int(everyIssuerData[2][0]),int(everyIssuerData[2][1]),int(everyIssuerData[2][2]),int(everyIssuerData[2][3]),int(everyIssuerData[2][4]),int(everyIssuerData[2][5]),int(everyIssuerData[2][6])]
if (i % 2) == 0:
worksheet.write(cellPos1,i,b)
worksheet.write_row(cellPos2, cellValue,b)
else:
worksheet.write(cellPos1,i,c)
worksheet.write_row(cellPos2, cellValue,c)
#增加一個Sheet
chartSheet = workbook.add_worksheet(‘Chart‘)
#增加一個折線圖圖表對象
chart_col = workbook.add_chart({‘type‘: ‘line‘})
name = ‘=%s!$J$1‘ % ‘Lottery‘
categories = ‘=%s!$B$2:$B$%s‘ % (‘Lottery‘,(i + 1))
values = ‘=%s!$J$2:$J$%s‘ % (‘Lottery‘,(i + 1))
print(‘%s|%s|%s‘ % (name,categories,values))
chart_col.add_series({
# 這裏的sheet1是默認的值,因為我們在新建sheet時沒有指定sheet名
# 如果我們新建sheet時設置了sheet名,這裏就要設置成相應的值
‘name‘: name,
‘categories‘: categories,
‘values‘: values,
‘line‘: {‘color‘: ‘blue‘},
})
chart_col.set_title({‘name‘: ‘藍色球分析‘})
chart_col.set_x_axis({‘name‘: ‘開獎日期‘})
chart_col.set_y_axis({‘name‘: ‘BlueNumber‘})
chart_col.set_style(1)
chartSheet.insert_chart(‘B2‘, chart_col)
chart_col.set_size({‘width‘: 10000, ‘height‘: 500})
workbook.close()
以上代碼運行的結果是:
好了,到此我的目的基本實現,後面也許會嘗試利用一些“運去”算法實現一些數據分析,看有沒有時間了。
如果喜歡本文請給我點個贊,如果本文由什麽紕漏,也請大家不吝賜教,共同進步~
文檔和源碼附件在:http://down.51cto.com/data/2445912
利用Python實現爬去彩票網站數據——小樣