前回に引き続き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をオブジェクトっぽく扱えるのがいいですね。
結果
実行すると、こんな感じ
まとめ
スクレイピングするのはPHPより断然こっちの方が便利だなーって思います。
UA偽装もできるので、あんなことやこんなこともできそうです。
ただ、PHPよりエラーに対して厳しく、ちょっとでもパースできないことがあるとエラるので、try..except…は必須かもしれません。
※この先みずほのサイトのHTMLが変わって、上記のソースで取得できなくなるかもしれないですが、あしからず

