機械学習で日本酒をクラスタリング Part1 スクレイピング編

2016-03-06

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

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()