今回から何回かに分けて、機械学習で日本酒の味のタイプのクラスタリングをする動画をやっていきたいと思います。
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()