今回から何回かに分けて、機械学習で日本酒の味のタイプのクラスタリングをする動画をやっていきたいと思います。
Part1はデータを取得するスクレイピング編です。
機械学習はまず、データを集めるところから始まります。
日本酒の銘柄マスタを作るために、こちらの日本酒物語のサイトからスクレイピングをかけて銘柄を取得し、日本酒銘柄CSVを作ります。
スクレイピングにはPythonのBeautiful Soupを使います。こちらはAnacondaをインストールすると、一緒に入るのでそれを使います。
スクレイピングするソースはこちら
python2系
# -*- coding:utf-8 -*-
import urllib2
import codecs
from bs4 import BeautifulSoup
f = codecs.open('sake.csv', 'w', 'utf-8')
f.write('code,meigara,kana,kuramoto,ken,shi,address'+ u"\n")
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)
tpl_url='http://www.sakeno.com/all_meigara_todou/{0}'
for i in xrange( 1, 48 ):
url=tpl_url.format( i )
soup = BeautifulSoup(urllib2.urlopen(url).read())
tr_arr = soup.find('table', {'class':'hyoji'}).findAll('tr')
for tr in tr_arr:
lrg = tr.find('strong', {'class':'lrg'})
if lrg is None:
continue
meigara = lrg.find('a').string
code = lrg.a.get("href").split("/")[-1]
kana = tr.find('div',{'class':'smls'}).string
td = tr.find('td',{"class":"smll"})
kuramoto = td.find('strong').find('a').string
kenshi = td.findAll('a')
ken = kenshi[1].string
if len( kenshi ) > 2:
shi = kenshi[2].string
tag = td.text
address = tag.split(u"TEL")[0].split(" ")
address = ken + address[1]
address = address.split(u"(")[0]
else:
shi = ''
address = ''
if kana is None:
kana = ''
meigara = meigara.split(u"(")[0]
kuramoto = kuramoto.split(u"(")[0]
print code,meigara,kana,kuramoto,ken,shi,address
f.write(code + ',' + meigara + ','+ kana +','+ kuramoto + ',' + ken + ',' + shi + ',' + address + u"\n")
f.close()
python3系
# -*- coding:utf-8 -*-
import urllib.request
import codecs
from bs4 import BeautifulSoup
f = codecs.open('sake.csv', 'w', 'utf-8')
f.write('code,meigara,kana,kuramoto,ken,shi,address'+ "\n")
headers={'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'}
tpl_url='http://www.sakeno.com/all_meigara_todou/{0}'
for i in range( 1, 48 ):
url=tpl_url.format( i )
req = urllib.request.Request(url, headers = headers)
soup = BeautifulSoup(urllib.request.urlopen(req).read())
tr_arr = soup.find('table', {'class':'hyoji'}).findAll('tr')
for tr in tr_arr:
lrg = tr.find('strong', {'class':'lrg'})
if lrg is None:
continue
meigara = lrg.find('a').string
code = lrg.a.get("href").split("/")[-1]
kana = tr.find('div',{'class':'smls'}).string
td = tr.find('td',{"class":"smll"})
kuramoto = td.find('strong').find('a').string
kenshi = td.findAll('a')
ken = kenshi[1].string
if len( kenshi ) > 2:
shi = kenshi[2].string
tag = td.text
address = tag.split(u"TEL")[0].split(" ")
address = ken + address[1]
address = address.split("(")[0]
else:
shi = ''
address = ''
if kana is None:
kana = ''
meigara = meigara.split("(")[0]
kuramoto = kuramoto.split("(")[0]
print(code,meigara,kana,kuramoto,ken,shi,address)
f.write(code + ',' + meigara + ','+ kana +','+ kuramoto + ',' + ken + ',' + shi + ',' + address + "\n")
f.close()
