自從民國97年以來,威力彩成為台灣彩券的新玩法,也成為許多人想要一夜致富的管道,因為威力彩的頭獎獎金通常是台灣彩券當中最高的,因此會有許多民眾購買,希望能獲得頭彩,早日財富自由,然而中頭獎的機率微乎其微,甚至比被雷打到的機率還低,然而人們還是希望根據過往的開獎號碼,一探究竟,看看是否能找出規律。
因此本文章將會分成上篇與下篇,上篇將教大家如何爬取過去的威力彩開獎號碼外,並告訴大家如何用Pandas這個套件進行資料處理,讓資料成為我們需要的型態,下篇將會教大家如何找出過往最常開出的號碼,以及更進一步的分析。(爬取網站: https://www.pilio.idv.tw/lto/listbbk.asp?indexpage=1&orderby=new)
1. 首先先導入套件:
2. 爬取威力彩號碼的第一頁網頁:
在這幾行程式碼當中,我們首先先放入網址,接著用requests套件的get函數讀取這個網頁,再用encoding重新進行編碼
因為python讀取中文網頁的過程中,可能會產生亂碼,因此要透過編碼的方式,一般而言,常見的中文編碼有兩種分別是”utf-8”與”big5”,在這個網頁當中則是透過”big5”,進行編碼,
著我們將r.text放入StringIO再用pandas當中的read_html讀取,此時我們將會讀取到這個網頁中所有的表格,我們所需要的表格為這個網頁當中的第二個表格,因此dfs[1]選取第二個表格,
後打上df.head()看一下爬下來表格的前五列,如果要看最後五列可用df.tail(),即可。
以上此方法可以幫助大家,在大部分的時候爬取網頁當中有表格的資料。
3. 爬取威力彩網頁第2頁到最後一頁進行合併:
其實當一個網頁有很多頁資料的時候,他的網址通常都有規律性
因此首先我們將網址頁碼的部分用{}表示,並用迴圈表示出數字2到51,因為我們要的頁數是第2頁到最後一頁第50頁,所以range(2,51)
再用format函數將數字依序帶入,最後再將後面爬取的49頁與第一頁表格用concat函數進行合併,最後打上df就能看到我們爬取的所有50頁的資料了。
4. 將表格進行資料處理:
首先,我們爬取的每一頁表格當中,第一列都並不是號碼,而是欄位,我們要的是開獎號碼的資料,因此我們反向思考,只要選取第一欄資料不是”期數”的資料就好
在pandas當中我們用 ”!=” 表示不等於,接著將欄位名稱改成[‘期數’,’日期’,’第一區’,’第二區’,’備註’],我們能看到第一列是最近的開獎號碼,我們希望表格第一列是從第一期開始,因此df[::-1] 就能讓表格倒過來了
接著用set_index將”期數”設位索引值,我們接下來用pd.to_datetime此函數,將”日期”欄位改變成時間的資料型態,以方便做後續的處理
我們接著用datetime套件當中的dayofweek函數,他可以辨識出”日期”是星期幾,由於dayofweek辨識出星期一會顯示 ”0”,星期天會顯示 “6”,為了讓我們看起來更直覺,所以我們將dayofweek轉換後 “+1”,最後我們就能看到整理好的表格了。
5. 創造出一個新表格:
創造一個新的df_1表格,首先原先df表格當中的 “第一區” 當中的六個號碼,用逗號隔開在同一個欄位,我們先用split(“,”,expand=True)函數將”第一區”這欄資料根據逗號分開,expand=True代表資料會自動展開成六欄
接著給分開的這六欄取上欄名,然後將df表格當中的 ”第二區”與”星期”這兩欄資料放入df_1這個表格當中
最後將資料型態從Object改成int型態,這樣資料才可以變成數值型態,做後續分析型態。
6. 將第一區的六個號碼用逗號隔開存在同一個欄位:
這裡我們將”第一”到”第六”的六個欄位中的數值,用逗號隔開並合併到一個新欄位”第一區”當中
在這裡很多人會想說我們為何要合併後又分開,原因有兩個,第一個是分成六個欄位,我們在下篇的時候可以方便進行數字計算,第二個是此時你觀察df表格當中的第一區的3號球,顯示為”03”,然而在df_1表格中的第一區的3號球,顯示為”3”,這兩個表示方式意義不同,一個為字串,一個為數值
為了我們在下篇進行關聯分析時,不會讓結果產生亂碼不好解讀時,一律改成數值型態,以方便進行分析。
7. 儲存成Excel檔:
感謝您的觀看,本篇告訴大家如何爬取網頁當中的表格資料,並運用pandas當中的幾個技巧,進行資料處理,當中使用的幾個函數,例如:split、dayofweek、astype、set_index,都是在資料處理當中非常常見的函數,大家可以多加利用
下篇將會告訴大家如何找出最常開出的號碼,或是最常同時開出的兩個、三個號碼,也會進一步對威力彩開獎號碼有更深入的分析。
棒棒
我不是這篇文章的原作者,但為了練習自己試了一遍,希望對大家有幫助
https://colab.research.google.com/gist/jeffeuxMartin/1de442b2d9dea600baa2127f1517f8c8/python.ipynb#scrollTo=fXs9M6sdolVt
請問有辦法將Excel下載下來嗎?
請問,我依照以上方式做都沒問題,但是切換到539時就會有問題
df_1=df[‘第一區’].str.split(‘,’,expand=True)
df_1.columns=[‘第一’,’第二’,’第三’,’第四’,’第五’,’第六’]
df_1[‘第二區’]=df[‘第二區’]
df_1[‘星期’]=df[‘星期’]
df_1=df_1.astype(int)
df_1[‘日期’]=df[‘日期’]
df_1.head()
這裡我將第六刪除後執行就會出現問題,新手練習中方便指導,謝謝
我自己發現問題點了,威力採的欄位都有,分開
例如:02 , 05 , 15 , 18 , 32 , 35
但是539的欄位卻是 08 , 14 22 , 27 , 35
在網頁上14跟22沒有 , 來分開…….
這個有辦法解決嗎?