jupyterでデータをスクレイピングして簡単な解析を行う2（裏代：マイルで的中させる）

競馬データをスクレイピングして加工作業をする。
前回の部分は説明を端折ってる部分があるので以前のをみてください。
https://qiita.com/yobee/items/9207d10b755fb8d743bc
※スクレイピングはサイトによって禁止されているところもあります。マナーを守っておこなってください。

過去分とプラス足りない内容をスクレイピングし付帯しています。

```
from bs4 import BeautifulSoup 
from urllib.request import urlopen
import pandas as pd
html = urlopen("http://race.hogeba.com/?pid=special&id=0119")
soup = BeautifulSoup(html, "html5lib") 
urls=[]
for link in soup.find_all('a'):
    hrefs = link.get('href')
    if hrefs.find('/race/')!=-1:
        if hrefs[28:32] !='2017':
            urls.append(hrefs)
race_datas=pd.DataFrame()
counter = 1
            
for race_link in urls:
    
    race_html = urlopen(race_link)
    #該当URLのhtml形式の中からTable内のデータを取得します。     
    race_fetched_dataframes = pd.io.html.read_html(race_link)
    #今回は該当データの配列が０番に該当したのでそちらを取得します。
    race_data = race_fetched_dataframes[0]
    print(race_link)
```

（追加部分）スクレイピング後にDataFrameに追加しました。

```
    soup3 = BeautifulSoup(race_html , "html5lib")
    soup4 = soup3.div.dd.span

    #データフレーム内に年の情報がなかったのでURL情報が取得し、年情報を作成します。
    race_data['meta']=soup4.text
```

下記はだいたい以前どおり抽出。

```
    race_data['year']= race_link[28:32]
    #jupyter内で作成したデータをCSV形式て出力します。
    #別途抽出するデータを事前に縦方向に結合します。axisは行列方向を指定します。行(0),列(1)
    race_datas = pd.concat([race_datas,race_data],axis=0)
#結合したデータをCSVで出力します。
race_datas.to_csv('races.csv',encoding='shift_jisx0213')
```

（以後追加分）時間の扱いを追加

```
import pandas as pd 
from datetime import datetime
```

ーで切り分けられている部分を分けて格納する。


```
#ハイフンを抜き出します。
datas1['tuka'] = df['10'].str.split('-')
datas1['tuka1'] = df['10'].str.split('-').str[0]
datas1['tuka2'] = df['10'].str.split('-').str[1]
#年齢と性別を分けます。
datas1['sex'] = df['4'].str[0:1]
datas1['age'] = df['4'].str[1:2]
#馬体重を分ける
datas1['weight'] = df['14'].str[0:3]
datas1['weight+-'] = df['14'].str[4:-1]
#スクレイピング付帯情報をスクレイピング
datas1['range'] = datas1['meta'].str.split(' ').str[1]
datas1['range'] = datas1['range'].str[1:5]
datas1['wk'] = datas1['meta'].str.split(' ').str[3]
datas1['weather'] =datas1['wk'].str.split('/').str[0]
datas1['floor'] =datas1['wk'].str.split('/').str[1]
#性別置き換え
datas1['sex'] = datas1['sex'].where(datas1['sex'] == '牡',1)
datas1['sex'] = datas1['sex'].where(datas1['sex'] != '牡',0)
#天気を置き換え
datas1['weather'] = datas1['weather'].where(datas1['weather'] == '晴',1)
datas1['weather'] = datas1['weather'].where(datas1['weather'] == '曇',2)
datas1['weather'] = datas1['weather'].where(datas1['weather'] == '雨',3)
```

以前と同様に不純なデータを抜きます。

```
#さらに不要なデータを抽出します。
datas2 = datas1[['year','0','1','2','3','7','11','12','13','tuka1','tuka2','sex','age','weight', 'weight+-','range', 'weather', 'floor']]
#不要なデータを削除します。今回であれば数値データ内に文字データが入っていたので削除しました。
datas2 = datas2[datas2['0']!='着順' ]
datas2 = datas2[datas2['0']!='取']
datas2 = datas2[datas2['0']!='中']
datas2 = datas2[datas2['0']!='7(降)']
datas2 = datas2[datas2['0']!='12(降)']
#カラムに名前追加※これ最初の方が良いかも
datas2.columns = ['year','rank','wakuban','umaren','name','time','agari','ozzu','ninki','tuka1','tuka2','sex','age','weight', 'weight+-','range', 'weather', 'floor']
datas2.head()
#そして取り出し
datas2.to_csv('out.csv')
```

pythonでの下処理は今回は以上になります。
今回はラピットマイナーを使って解析したいと思います。

続く

○過去分
jupyterでデータをスクレイピングして簡単な解析を行う（裏代：エ杯で的中させる）
https://qiita.com/yobee/items/9207d10b755fb8d743bc