BeautifulSoupでロト7の当選番号をすっぱ抜いてくる

2014-01-08

前回に引き続きPython初心者シリーズ

みずほのサイトからロト7の当選番号をすっぱ抜いてくるサンプルを紹介します。

スクレイピング

PHPでスクレイピングをやろうとすると、curlで取ったHTMLをpreg_match等を使ってDOMを解析することになりますよね(今はもっと便利なモジュールがあるのかもしれないけど)

Pythonだと、BeautifulSoupという大変便利なモジュールがあります。

パースされたデータに対しての操作が超絶便利です。

サンプルソース

今回もGitにあげてあります。

https://github.com/inkenkun/python_scraping

必要モジュール

#HTMLパーサー
sudo pip install BeautifulSoup

上記で入れると、BeautifulSoup の3系が入ります。

新しい4系を入れたい場合は、pip install beautifulsoup4 です。

4系を入れる場合は、html5libを入れないと、パーサーがエラーを吐く場合があります。

ちなみにSoapプロトコルのsoapではなく、ビューティフルスープです。

かっこいいのか痛いのかよくわかりません。

ソース

大したことしてないので全部載せます


# -*- coding:utf-8 -*-

import re
import urllib2

# BeautifulSoup 3系を使う場合
#from BeautifulSoup import BeautifulSoup

# BeautifulSoup 4系を使う場合
from bs4 import BeautifulSoup

### UAを設定
opener = urllib2.build_opener()
opener.addheaders=[
    ('User-Agent', "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36"),
    ('Accept-Language','ja,en-us;q=0.7,en;q=0.3')
]
urllib2.install_opener(opener)

url = "http://www.mizuhobank.co.jp/takarakuji/loto/loto7/index.html"
soup = BeautifulSoup(urllib2.urlopen(url).read())

#回数
table = soup.findAll("table")[0]
regex = u'第(.*?)回'
kuji_id = re.search(regex, unicode(table)).group(1)

#日付
td = table.findAll("td")[0]
regex = u'<td(.*)>(.*?)</td>'
regdate = re.search(regex, unicode(td)).group(2)
regdate = regdate.replace(u'年', '-')
regdate = regdate.replace(u'月', '-')
regdate = regdate.replace(u'日', '')

#当選番号
num = []
for td in table.findAll("td")[1:10]:
	num.append(td.find("strong").string)

numX1 = num[7].replace('(', '').replace(')', '');
numX2 = num[8].replace('(', '').replace(')', '');

print u"回数:" + kuji_id
print u"日付:" + regdate
print u"当選番号1:" + num[0]
print u"当選番号2:" + num[1]
print u"当選番号3:" + num[2]
print u"当選番号4:" + num[3]
print u"当選番号5:" + num[4]
print u"当選番号6:" + num[5]
print u"当選番号7:" + num[6]
print u"ボーナス数字1:" + numX1
print u"ボーナス数字2:" + numX2

re は正規表現モジュール、urllib2 はURLを開くためのライブラリです。

あと何気に、num[7].replace(‘(‘, ”).replace(‘)’, ”) こんな感じでメソッドチェーンで書けるのが便利

ポイント

ポイントは以下です。


url = "http://www.mizuhobank.co.jp/takarakuji/loto/loto7/index.html"
soup = BeautifulSoup(urllib2.urlopen(url).read())
table = soup.findAll("table")[0]

2行目のsoupにurl先のHTMLが全部文字列で入っています。

3行目 そのsoupに対して、findAll(“table”)[0] ( table = soup.find(“table”) でも同じ )として、はじめのtableタグを中身ごとごっそり取ってきています。

こうやって、HTMLをオブジェクトっぽく扱えるのがいいですね。

結果

実行すると、こんな感じ

スクリーンショット 2014-01-08 14.03.57

まとめ

スクレイピングするのはPHPより断然こっちの方が便利だなーって思います。

UA偽装もできるので、あんなことやこんなこともできそうです。

ただ、PHPよりエラーに対して厳しく、ちょっとでもパースできないことがあるとエラるので、try..except…は必須かもしれません。

※この先みずほのサイトのHTMLが変わって、上記のソースで取得できなくなるかもしれないですが、あしからず