python でロト6の最新当選番号を取得してみる

WEBページの表示方法が変わっていて、以下の方法では取得できなくなっていました。

くじ、ロト6などの結果を取得する方法をごらんください。そのままCSVで取れそうです。(GIST)


python では、文字列処理が簡単にでき、インターネット上のデータへのアクセスも簡単にできます。

そこで、python でロト6の最新の当選番号を取ってみたいと思います。

ライブラリリファレンスの urllib のあたりを見てみると、Requests モジュールというのがおすすめなようなので、まず、このモジュールをインストールしておきます。(pip をインストールしておく必要があります。)

pip install requests

さて、みずほ銀行のホームページからデータを取ってみます。

>> import requests
>>  r= requests.get(‘http://www.mizuhobank.co.jp/takarakuji/loto/loto6/index.html’)
>> r
<Response [200]>

取れたようです。

>> print(r.text)

文字化けしているようです。

>> r.encoding
‘ISO-8859-1’

クイックスタートを見ると、encodingsを変えればよさそうです。

>> r.encoding=’utf-8′
>> print(r.text)

文字化けせず表示されるようになりました。
html が返ってきています。

<table class=”typeTK”>

<!–end .typeTK–></table><table>

の部分に格納されているので、ここを取り出せばよいですね。
python の標準ライブラリを使って頑張ってもいいのですが、めんどうなので、BeautifulSoup というライブラリを使います。

quit() で一旦抜けて、pip install beautifulsoup4 を実行します。

もう一度、python を起動します。

>> import requests
>> r=requests.get(‘http://www.mizuhobank.co.jp/takarakuji/loto/loto6/index.html’)
>> r.encoding=’utf-8′

をもう一度打ちなおします。
>>> import bs4
>>> s = bs4.BeautifulSoup(r.text)
とします。
>>> s.title
<title>u307fu305au307bu9280u884c u5b9du304fu3058u30b3u30fcu30cau30fcuff1au30edu30c86xa0u6700u65b0u56deu53f7</title>
>>> print(s.title)
<title>みずほ銀行 宝くじコーナー:ロト6&nbsp;最新回号</title>
とか、
>>> s.find_all(‘table’)
[<table class=”typeTK”>
:
</table>]
>>> t=_
>>> len(t)
3
>>> t[0]
<table class=”typeTK”>
:
</table>
といったことができます。
あまりに簡単すぎて笑ってしまいます。
今回は、3回分掲載されているので、len(t)には3が返ってきました。
>>> len(t[0].find_all(‘tr’))
11
確かに表には 11 行あります。
先頭行は取れているでしょうか。
>>> t[0].find_all(‘tr’)[0]
<tr>n<th class=”center wide33p”>u56deu5225</th>n<th class=”center bgf7f7f7″ colspan=”6″>u7b2c1052u56de</th>n</tr>
th 要素だけでできているようなので、
>>> t[0].find_all(‘tr’)[0].find_all(‘th’)
[<th class=”center wide33p”>u56deu5225</th>, <th class=”center bgf7f7f7″ colspan=”6″>u7b2c1052u56de</th>]
>>> len(t[0].find_all(‘tr’)[0].find_all(‘th’))
2
確かに 2 列あります。
>>> t[0].find_all(‘tr’)[0].find_all(‘th’)[1]
<th class=”center bgf7f7f7″ colspan=”6″>u7b2c1052u56de</th>
>>> t[0].find_all(‘tr’)[0].find_all(‘th’)[1].text
u’u7b2c1052u56de’
>>> print(t[0].find_all(‘tr’)[0].find_all(‘th’)[1].text)
第1052回
第1052回というのが取れています。
>>> t[0].find_all(‘tr’)[2].find_all(‘td’)[0]
<td class=”center extension”><strong>06</strong></td>
>>> t[0].find_all(‘tr’)[2].find_all(‘td’)[0].text
u’06’
(先頭の u は unicode 文字列を意味しています。version 2.7系で実行しているので。)
本数字のほうはどうでしょう?一つ目の表の3行目に、td タグで書かれているようなので、
>>> t[0].find_all(‘tr’)[2].find_all(‘td’)
[<td class=”center extension”><strong>06</strong></td>, <td class=”center extension”><strong>26</strong></td>, <td class=”center extension”><strong>34</strong></td>, <td class=”center extension”><strong>37</strong></td>, <td class=”center extension”><strong>42</strong></td>, <td class=”center extension”><strong>43</strong></td>]
>>> len(_)
6
6個取れました。
全部表示してみましょう。
>>> for i in t[0].find_all(‘tr’)[2].find_all(‘td’):
…     print(i)
<td class=”center extension”><strong>06</strong></td>
<td class=”center extension”><strong>26</strong></td>
<td class=”center extension”><strong>34</strong></td>
<td class=”center extension”><strong>37</strong></td>
<td class=”center extension”><strong>42</strong></td>
<td class=”center extension”><strong>43</strong></td>
タグが邪魔なので、
>>> for i in t[0].find_all(‘tr’)[2].find_all(‘td’):
…     print(i.text)
06
26
34
37
42
43
リストにして持っておくと、後々便利かもしれません。
>>> [i.text for i in t[0].find_all(‘tr’)[2].find_all(‘td’)]
[u’06’, u’26’, u’34’, u’37’, u’42’, u’43’]
文字列でなく、数字のリストで持つ場合、
>>> [int(i.text) for i in t[0].find_all(‘tr’)[2].find_all(‘td’)]
[6, 26, 34, 37, 42, 43]
後はこのリストと、申しこんだ番号を比較すればよいですね。
これについては、また、次回にでも。

loto6_latest.py

import requests
import bs4
r= requests.get(‘http://www.mizuhobank.co.jp/takarakuji/loto/loto6/index.html’)
s = bs4.BeautifulSoup(r.text, “lxml”)
t = s.find_all(‘table’)
l = [int(i.text) for i in t[0].find_all(‘tr’)[2].find_all(‘td’)]
print(l)

※ 私の環境では、実行すると、warning が出るので以下のようにしています。
s = bs4.BeautifulSoup(r.text, “lxml”)