前回に引き続き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が変わって、上記のソースで取得できなくなるかもしれないですが、あしからず