としおの読書生活

田舎に住む社会人の読書記録を綴ります。 主に小説や新書の内容紹介と感想を書きます。 読書の他にもワイン、紅茶、パソコン関係などの趣味を詰め込んだブログにしたいです。

2019年03月

DSC_4091

辻村深月さんの『傲慢と善良』を読みました。タイトル通り人間の傲慢さと善良さをテーマに扱った作品で、私はこの作品を読むまでどちらかと言えば自分は善良な人間であると考えていたのですが、読了後その考えを改めなおす必要があると感じてしまいました。

また本作では婚活をテーマとして扱っているため、これから婚活をしようとしている人間や婚活で行き詰った人には参考になるかもしれません。

以下、感想を書いていきます。ネタバレもあるので未読の方はご注意ください。


傲慢な人間と善良な人間の違い


傲慢な人間とは自分の最も価値の高い特徴と相手の最も価値の低い特徴を比べて、自分の特徴が優っているときに相手を見下す人間です。傲慢な人間には価値観が狭い世界で完成しきっているという傾向があります。

本書では傲慢な人間として真奈美の母である陽子、美奈子などの架の友人などが登場しました。彼女らの共通の特徴として人を完全に信じることができないというものがあります。

架の友人の女性らはみんなそろって真美がストーカーの被害にあっているということを信じていませんでした。彼女らが真美の言葉を信じることができなかったのは、自分たちが平気で嘘をつくことができる人間なので嘘をつきなれていない人間の嘘をすぐに見分けることができるからだ。


一方、善良な人間は傲慢な人間と対義的な関係となっており、自分の最も価値の低い特徴と相手の最も価値の高い特徴を比べて相手の良いところを見つけることのできる人間です。

この小説では善良な人間として金居や花垣が登場しました。金居と花垣は人間としてはコミュニケーション能力が高いタイプと低いタイプで似ている人間とは言えないのですが彼らには共通した特徴があります。それは、相手の言うことを言葉通り信じることができるというものです。

金居も花垣も架から真美がストーカーに誘拐されたという話を聞いたとき本気で真美のことを心配して自分が話せる手がかりを真摯に話そうとしてくれました。


本作では傲慢な人間には女性が多く、善良な人間には男性が多い傾向があるのですがこれはたまたまなのでしょうか。男性社会よりも女性社会の方が嘘や陰口を言う人間が多いということを暗に言っているような気がします…(もちろん男性にも婚活前の架のように傲慢な人間はいる)。




真美の成長


この作品は婚活をテーマにしている一方、架や真美の成長物語でもあります

物語の序盤で真美は小野里から傲慢かつ善良な人間であると言われていました。この作品では傲慢と善良の両方の特徴を持つ人間は真美しか現れませんでしたが、二つの特徴を持つ人間はいい年齢になっても親から自立できておらず中途半端な人間であると感じました。

真美は中途半端であるがゆえに自分のほしいものが分からず、親のななすがままに婚活を進めたため、婚活はなかなか上手くいきませんでした。

そこで親から自立するために東京で一人暮らしをはじめ、婚活アプリで架と出会います。しかし、架に自分が70点の女性であると言われているショックとストーカー被害にあっているという嘘が架にバレルのを恐れて失踪してしまいます。

失踪後、東北でボランティア活動に参加しているうちに真美は自分が今までちっぽけな世界で生きていたことに気が付き真の善良な人間へと変化していきます。

最終的に、架と自分の意思で結婚をして完全に親から自立し一人の大人へと成長していきました。


余談になるのですが小野里は真美を善良であり傲慢な人間だと表現していますが、過去の回想の真美は心の中で学歴や容姿に自身があり、どこかで他人を見下している場面がところどころあったため傲慢よりな人間であると思ってしまったのは私だけなのだろうか。



婚活に対する考え方の変化


私はまだ学生であるというのもありますが、今まで婚活を一度もしたことがありません。そのため、婚活に対して出会いのない場がない社会人が合コンなどの延長戦として恋愛相手を求めて婚活をしているというイメージしかありませんでしたがこの作品を読んで婚活に対するイメージが変わりました。

婚活をしている人間の多くは真剣に今後の人生のパートナーがほしいと思い真剣に婚活に取り組んでいたのですね。

また、結婚相談所によるお見合いのような婚活は家の都合や最終手段としてしか考えていなかったのですが、小野里の言っていた通り結婚相談所を最終手段と考えるのは間違っているように感じました。

人それぞれ婚活の場があり得手不得手もあるので自分にあった婚活をするのが一番なんですね。



最後に


物語の最終場面はドキドキしましたが架と真美が幸せになるような結果で良かった。

私がまだ結婚も婚活もしたことがないため、この作品を100%楽しむことができたとは言えないのでまた成長してから『傲慢と善良』を読み直したいです。婚活や結婚を経験している人がこの作品を読んでどのような感想を持ったかが気になります。

この作品は作中でも出てくるのですが『高慢と偏見』という本がモデルになっているみたいなのでそちらも一度読んでみたいな。






今回の記事では前回の記事で収集したロト6の当選番号を用いて、機械学習を使って当選番号を予測してみました。

どの機械学習の手法を使うか悩んだのですが、今回は過去の当選番号を時系列データとして扱い次の当選番号を予測しようと思ったためSVRを使うことにしました。RNNを使うのもありだとは思ったのですが、学習に時間がかかりそうだったのでとりあえず手軽に実装できるSVRで試してみます。



ライブラリのインストール


今回、SVRを実装するにあたり scikit-learn を使用しました。scikit-learnは以下のコマンドでインストールすることができます。
pip install scikit-learn
また、こちらはインストールしなくてもいいのですがデータをグラフ化して分析するのにはMatplotlibを使用しました。Matplotlibは次のコマンドでインストールすることができます。
pip install matplotlib


Matplotlibを使って過去の当選番号をグラフ化してみる


とりあえず過去の当選番号の第1回目から第100回目までの結果を本数字1~6にわけてグラフ化してみます。
import pandas as pd
import matplotlib.pyplot as plt

train = pd.read_csv("loto6.csv") # 前回の記事で保存したデータの読み込み

# 第1回目から第100回目までの本数字をリスト化
x = train["round"].values[:100] main1 = train["main1"].values[:100] main2 = train["main2"].values[:100] main3 = train["main3"].values[:100] main4 = train["main4"].values[:100] main5 = train["main5"].values[:100] main6 = train["main6"].values[:100]

%matplotlib inline # jupyter notebookで描画 plt.plot(x, y1, color="red", label="main1") plt.plot(x, y2, color="darkorange", label="main2") plt.plot(x, y3, color="yellow", label="main3") plt.plot(x, y4, color="greenyellow", label="main4") plt.plot(x, y5, color="cyan", label="main5") plt.plot(x, y6, color="blue", label="main6") plt.legend(bbox_to_anchor=(1.05, 1)) plt.show()
loto2_1

グラフを見ている限り、ロト6の当選番号に規則性がなくて機械学習で予測するのは無理そうですが、ロマンを追い求めるために予測しようとしているので気にしない方向で行きます。




SVRを使って予測してみる


サポートベクター回帰(SVR)とはサポートベクターマシン(SVM)を回帰分析に応用した手法です。SVRについて詳しく知りたい方は下記のページが参考になると思います。

https://datachemeng.com/supportvectorregression/

今回は第n回目の当選番号を予測するのに、第1回目から第n-1回目までの当選番号を訓練データとしてSVRで予測します。また本番号は6つありますが、各番号が独立したデータと考えます。

上記の方法で1261回目~1340回目までの結果を予測してみたところ5等が3回だけ当たりました。16000円分宝くじを購入して、3000円しか返ってこないのは悲惨です。わざわざ機械学習をつかっているのに乱数で番号を選択した場合とあまり変わらない気がします…。

訓練データの数を変更したりしてみたのですが結果はあまり変わらずSVRでロト6の予測するのは難しそうです。各本番号を独立したデータとして考えたのも失敗した要因なのかもしれません。ハイパーパラメータをもっと細かく調整すればもう少しマシになる可能性もありますが、正直そこまで変わらない気がします…。

一応SVRでロト6の当選番号を予測するコードを載せておきます。コードが無駄に長くて申し訳ありません。
# -*- coding: utf-8 -*-
# loto6の番号をSVRを使って予想

import pandas as pd
import numpy as np
from sklearn import svm

# 訓練データとテストデータの読み込み
train = pd.read_csv("loto6.csv") # 第1~1260回目
test = pd.read_csv("loto6_test.csv") # 第1261~1340回目

train_x = train["round"].values
train_X = train_x[:, np.newaxis] # SVRで学習できるように変換
train_y1 = train["main1"].values
train_y2 = train["main2"].values
train_y3 = train["main3"].values
train_y4 = train["main4"].values
train_y5 = train["main5"].values
train_y6 = train["main6"].values
test_y1 = test["main1"].values
test_y2 = test["main2"].values
test_y3 = test["main3"].values
test_y4 = test["main4"].values
test_y5 = test["main5"].values
test_y6 = test["main6"].values
pre_list = np.array([np.zeros(7)]) # 予測結果を格納

# 学習の設定
my_svr = svm.SVR(kernel="rbf", C=1e1, gamma=0.1, epsilon=0.1)

# 1261回~1340回まで学習と予測を繰り返す
for i in range(1, len(test_y1)+1):
  print(i+1260)
  pre_num = np.array([])
  
  # 学習して結果を予測
  #第1回目~1260+i-1回目までの結果を使って1260+i回目の結果を予測
  my_pre_1 = my_svr.fit(train_X, train_y1).predict(np.array([[1260+i]]))
  my_pre_2 = my_svr.fit(train_X, train_y2).predict(np.array([[1260+i]]))
  my_pre_3 = my_svr.fit(train_X, train_y3).predict(np.array([[1260+i]]))
  my_pre_4 = my_svr.fit(train_X, train_y4).predict(np.array([[1260+i]]))
  my_pre_5 = my_svr.fit(train_X, train_y5).predict(np.array([[1260+i]]))
  my_pre_6 = my_svr.fit(train_X, train_y6).predict(np.array([[1260+i]]))
  
  pre_num = np.append(pre_num, np.round(my_pre_1))
  pre_num = np.append(pre_num, np.round(my_pre_2))
  pre_num = np.append(pre_num, np.round(my_pre_3))
  pre_num = np.append(pre_num, np.round(my_pre_4))
  pre_num = np.append(pre_num, np.round(my_pre_5))
  pre_num = np.append(pre_num, np.round(my_pre_6))
  pre_list = np.insert(pre_list, len(pre_list), pre_num, axis=0) # 四捨五入した結果を予測結果とする
  
  # train_X, train_y1に1260+i回目の結果を追加
  train_X = np.insert(train_X, len(train_X), 1260+i, axis=0)
  train_y1 = np.append(train_y1, test_y1[i-1])
  train_y2 = np.append(train_y2, test_y2[i-1])
  train_y3 = np.append(train_y3, test_y3[i-1])
  train_y4 = np.append(train_y4, test_y4[i-1])
  train_y5 = np.append(train_y5, test_y5[i-1])
  train_y6 = np.append(train_y6, test_y6[i-1])

# 予測結果を出力
pre_list = np.delete(pre_list, 0, 0) # 1行目を削除
df = pd.DataFrame(pre_list, columns = ["main1", "main2", "main3", "main4", "main5", "main6", "bonus", ])
df.index = df.index + 1
df.to_csv('loto6_pre.csv')




最後に


SVRでの予測は失敗に終わりました。気が向いたらRNNを使って予測する記事を作るかもしれません。


DSC_3831

だいぶ前に購入して読むのを忘れていた、長谷川夕さんのデビュー作『僕は君を殺せない』を読みました。

本書は中編である『僕は君を殺せない』と短編である『Aさん』と『春の遺書』から構成されています。中編と短編が混ざっている本はなかなか見ないので、目次を見た時点で珍しい構成だと感じました。

以下、書く物語について感想を書いていきます。ネタバレも含むので未読の方は注意してください。



僕は君を殺せない


夏、クラスメートの代わりにミステリーツアーに参加し、最悪の連続猟奇殺人を目の当たりにした『おれ』。最近、周囲で葬式が相次いでいる『僕』。——一見、接点のないように見える二人の少年の独白は、思いがけない点で結びつく……。

この作品は『おれ』(たぶん名前は明記されていない)と『僕』(清瀬誠)の二人の視点で物語が進んでいきます。

物語序盤では、『おれ』の視点では高額なアルバイト代のために参加したミステリーツアーで連続猟奇殺人に巻き込まれてしまい、殺人犯から逃げ出すために四苦八苦している様子が描かれています。一方、『僕』の視点では同じ高校に通うレイと半同棲生活を楽しそうに送っている様子が描かれています。

時系列がバラバラであり、二人の視点がけっこうな頻度で入れ替わっていくため、読み始めた時点ではなかなか物語の構造がつかめませんでした。しかし、物語が進むと『僕』の正体が『おれ』が参加したミステリーツアーの連続猟奇殺人犯であると分かったあたりから物語にどんどん引き込まれていきました。


『僕』は自殺してしまった父の恨みを晴らすために、次々と父が残したメモに名前がのっている親族を殺していきます。『僕』が事務的に殺害を行っていくこともあり、読んでいる途中は『僕』が感情のないロボットのように感じてしまいました。ただ、レイちゃんと一緒にいるときの『僕』は楽しそうで人間らしいところもありました。それも相まって、レイちゃんも殺害する対象であると分かったときの衝撃はすさまじかったです。

『おれ』は『僕』とは相対的な人物として描かれており、感情を表現する描写も多いことから人間らしい人物だという印象が強かったです。ただ、主役はあくまで『僕』なので『おれ』がどういった人物であるのかが細かく語られていなかったのが残念でした。


最終的に『僕』はレイを殺さなかったのですが、物語の終わりでは『僕』は意識不明で、レイは僕と過ごした記憶を失ってしまったということが『おれ』視点で語られています。バッドエンドではないがハッピーエンドとも言い難い終わり方でなんともいえない気分になりました。


タイトルの『僕は君を殺せない』の僕は『僕』のことだと明確に分かるのですが、君はレイちゃんのみのことを示すのか、それとも『おれ』も含むのか難しいところですね。本作を読んだ他の人はタイトルをどう解釈したのだろうか…。



Aさん


この物語はオチを読んで恐怖を感じました。

大人になった主人公である『わたし』が小学生のころに怖がっていたAさんと同じように風呂場で死体を解体しているというオチでしたが、最初の描写では主人公は掃除が好きでただ黙々と掃除をしているだけだと思っていたのでそのギャップがすさまじかったです。

しかも、『わたし』のもとにもAさん同様、殺した人の幽霊が訪れるという物語のしめかた。

短編小説には最後のどんでん返しがすごい作品がけっこうありますが、ここまで衝撃的だった作品は久しぶりな気がします。

春の遺書


この短編も『Aさん』と同じように幽霊が登場するのですが、『Aさん』と比べると物語のコンセプトが一味違う作品でした。

物語の途中では主人公の祖父は祖父の弟である康二朗に対してよっぽどひどいことをしたのだろうなと思っていたのですが、読み終わると祖父は康二朗が駆け落ちしようとした女性を追って自殺をしないように女性の遺品を隠していたという弟思いの人物でした。

祖父はそれさえ渡さなければ康二朗が自殺することはないと考え、死ぬ直前でも遺品のありかを康二朗に教えませんでした。しかし祖父の死後、康二朗は遺品はもう二度と自分の手元には戻らないと思い自殺してしまいます。

康二朗がけっきょく自殺してしまうのならば祖父はどうするべきだったのでしょうか。遺品を渡して康二朗に恨みなく自殺してもらった方がましだったのかもしれませんがそれが正解であったとは言えません。

なんだか複雑な作品です…。

最後に


長谷川夕さんの作品を初めて読んだのですが、どの物語も私的にはかなりつぼに入りました。この機会に他の作品も買ってみようかな。




DSC_3829

竹村彰通さんの『データサイエンス入門』(岩波新書)を読みました。

本書は近年話題となっている第四の科学であるデータサイエンスに関する入門書です。

本書はデータの整え方などがのっているわけではなく、あくまでデータサイエンスという言葉を多くの人に知ってもらうために書かれた本なので、すでにデータサイエンスについてあるていど知識がある方には物足りなく感じるかもしれません。

ただ、今後仕事などでデータサイエンスを使う可能性があるので概要を知りたいという方にはおすすめできる一冊となっています。

以下簡単に内容をまとめていきます。



データサイエンスとは


データサイエンスとは統計学と情報学と各専門分野に関する知識を併せ持った学問である。インターネットの普及がきっかけで大量のデータ(ビッグデータ)が得られるようになったことで、ビッグデータを分析し処理する手法が求められた。これがデータサイエンスの始まりである。

ビッグデータを処理することで今後の需要や売上を予測したりするなど、データを参考に未来を予測することができるようになる。これだけだと従来の統計学とあまり変わらないと感じるかもしれないが、データサイエンスは数字のデータを信じるだけではなく各専門分野に関する知識を生かしていくことに特徴がある。

データサイエンスを行うことができる人材のことをデータサイエンティストという。近年、海外の大学ではデータサイエンティスト学科が専門でできるほどデータサイエンティストは社会的需要がある。

一方、日本ではデータサイエンティストの育成が他の先進国と比べて遅れている。しかし、2017年に旧帝大と滋賀大学でデータサイエンス学部が設立されようやく国内でのデータサイエンティストの育成が始まった。

また、大学以外では高校数学で以前まであまり取り扱われていなかった統計の分野をもっと積極的に取り扱うように学習指導要領が改訂された。




ビッグデータとは


新聞などを読んでいるとビッグデータという言葉がたびたび出てきますが、今までのデータと比べてどう違うのかあまり明言されていません。

ビッグデータとはインターネットやセンサーの発展によりこれまで容易に収集できなかったデータが収集できるようになりました。従来のデータは母数が少ないという問題点がありましたが、各技術の発達によりこの問題が解消されました。

ビッグデータの分かりやすい例としてSNS上にアップロードされた画像やテキストデータなどがあります。

テキストデータを活用した例として、特定の話題毎に文書を分類するなどがあります。


データサイエンスを学ぶ方法


本書ではデータサイエンスを学ぶ方法についても書かれていたので以下に簡単にまとめていきます。


1. 統計学と情報学を学ぶ
データサイエンスは統計学と情報学ととても結びつきが強い学問です。そのため、統計学についての基本知識必要となります。また情報学においては機械学習の知識が必要となります。

最近では統計学を無料で学習することのできるeラーニングなどがあります。著者は無料のオンライン講座として以下のページを推奨していました。

http://gacco.org/

ただ、このページは受講可能な講座が期間限定となっているためタイミングが合わなかった場合は学びたい情報が得られない場合があるので、統計学と機械学習の知識を得るには私は以下の二つのサイトを活用したほうが良いと思います。

・Aidemy
https://aidemy.net/courses/find-a-course

・codExa
https://www.codexa.net/

Aidemyではプログラミング言語であるPythonと機械学習、深層学習の講座を無料で受講することができます。無料講座の数は少ないもののデータサイエンスティストとして求められる必要最低限の知識は得ることができると思います。

codExaではPythonと統計学、線形代数の講座を無料で受講できます。codExaを受講した後にもう少し深く数学的知識を得たいと思った場合、書籍を購入するなどをして学習するのが良いと思います。



2. ビッグデータの処理を実践してみる
統計学と情報学の知識を得ただけですぐにデータサイエンティストになれるわけではありません。実際に実践を通してビッグデータの処理方法を学ぶ必要があります。

著者はビッグデータの処理を実践するのに以下の二つのサイトを活用すべきだと言っています。

・kaggle
https://www.kaggle.com/

・SIGNATE
https://signate.jp

kaggleはオンラインのデータ解析コンピティションのサイトです。世界中の企業がデータサイエンティストをもとめて、様々な課題についてのコンピティションが常時解説されています。コンピティションの上位入賞者には賞金もでます。ただこのサイトは英語のサイトであるため、基本的な英語が読めることが前提となっています。

SIGNATEはkaggleの日本バージョンだと考えてもらえば大丈夫です。日本語のサイトなので英語ができない場合でも大丈夫です。kaggleと違ってコンピティションの数が少ないという欠点はありますが、kaggleよりもチュートリアルが充実しているので、入門としてはkaggleよりもSIGNATEの方が良いかもしれません。


最後に


本書ではブログでまとめた内容の他にもデータサイエンスの歴史、統計学の歴史、データとは何かなど様々なことについて書かれているのでデータサイエンスに興味がある方はぜひ一度読んでみてください。




前々からロト6の当選番号を機械学習で予測してみたいと思っており、やっと作業に着手し始めたので予測方法をまとめていきます。

機械学習で予測するには過去の当選番号を学習データとして収集する必要があるので、この記事ではみずほ銀行のページからPythonでスクレイピングを行い、過去の当選番号を自動的に収集する方法を説明していきます。



事前準備


今回スクレイピングをするにあたり、以下の3つの技術要素を利用します。
  • BeautifulSoup(スクレイピングを行うライブラリ)
  • Selenium(ブラウザの自動操作を行うツール)
  • PhantomJS(ヘッドレスブラウザ)
最初はBeautifulSoupだけを使用してスクレイピングをしようと思ったのですが、第461回目以降の当選番号が掲載されているページではJavascriptを使ってページが書かれており、BeautifulSoupだけでは集めることができなかったのでSeleniumとPhantomJSを使用することにしました。

以下インストール方法を説明していきます。


1. BeautifuSoupのインストール


BeautifulSoupはpipで導入する場合、以下のコマンドでインストールすることができます。
pip install beautifulsoup4
Anacondaを使っていてpipが使えない場合、以下のコマンドでインストールすることができます。
conda install -c anaconda beautifulsoup4


2. Seleniumのインストール


Seleniumはpipで導入する場合、以下のコマンドでインストールすることができます。
pip install selenium
Anacondaでインストールする場合、以下のコマンドでインストールすることができます。
conda install -c conda-forge selenium


3. PhantomJSのインストール


Windowsで導入する場合の手順は以下の通りになります。
  1. http://phantomjs.org/にアクセスしてサイトからダウンロード
  2. ダウンロードしたファイルを解凍し、c:\の直下に置く
  3. Pathを通す
よくわからない方は以下のページが参考になると思います。
https://gist.github.com/maechabin/7632c460ceede823cbde


Anacondaを使っている場合はPhantomJSもコマンド一つでインストールすることができます。
conda install -c conda-forge phantomjs
このコマンドはWindowsでも使えるため、WindowsでPythonを使うならばAnacondaを使った方が色々と便利そうですね。




過去の当選番号をスクレイピングしていく


環境構築ができたらスクレイピングをしています。今回コードを書く前に当選番号が掲載されているページのURLのパターンと、各ページでの当選番号の取得方法について考えていきます。


当選番号が掲載されているページのURLのパターン


ロト6の過去の当選番号はみずほ銀行のホームページで20回ごとにページを分けて掲載されています。そのためスクレイピングをする際に自動的にページを遷移させる必要があります。ここで一つ問題があり、第1回~第460回までの結果がのっているページのURLと第461回目以降の結果がのっているページのURLはパターンが違うため収集する際に注意しなければなりません。

第1回~第460回までのURLは以下のようになっています。(第1回目~第20回目の例)
https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/loto60001.html

ページごとに赤字で書いている部分が変更しており、
第1回目~第20回目の場合は0001、第21回目~第40回目は0021、第41回目~第60回目までは0041となっており値が20ずつ増えていきます。


第461回目以降のURLは以下のようになっています。(第461回目~第480回目の例)
https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/detail.html?fromto=461_480&type=loto6

これも先ほどと同様に赤字の部分が掲載されている当選番号の回数に伴い変化しています。
第461回目~第480回目の場合は461_480第481回目~第500回目の場合は481_500第501回目~第520回目の場合は501_520となっている。


当選番号の取得


全てのページで過去の当選番号はtableタグの中にあります。そのため最初に
table = soup.find_all("table")
と書いてtableタグないの全ての要素を取得します。取得したtableは以下のようになっています。(第501回目の例)
<table class="typeTK js-lottery-backnumber-temp-sp">
<tbody>
<tr>
<th class="bgf7f7f7 wdt33p">回</th>
<td>第501回</td>
</tr>
<tr>
<th class="bgf7f7f7 wdt33p">抽せん日</th>
<td>2010年6月17日</td>
</tr>
<tr>
<th class="bgf7f7f7 wdt33p">本数字</th>
<td>03 17 21 23 36 38</td>
</tr>
<tr>
<th class="bgf7f7f7 wdt33p">ボーナス数字</th>
<td class="green">07</td>
</tr>
</tbody>
</table>
3番目のtrタグ内のtdタグに当選番号が記載されている(赤字の部分)のでこの部分を抽出するコードは以下のようになります。
main_num = table[1].find_all("tr")[2].find("td")

またボーナス番号も取得したい場合、4番目のtrタグ内のtdタグにボーナス番号が記載されている(青字の部分)のでこの部分を抽出しましょう。



ソースコード


ロト6の当選番号を自動的に収集するコードを以下に載せておきます。
# -*- coding: utf-8 -*-
# ロト6の当選番号を自動的に収集する

import time
import random
import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup

# ロト6の当選番号が掲載されているみずほ銀行ページのURL
loto_url1 = 'https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/loto6' # 1~460回目
loto_url2 = 'https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/detail.html?fromto=' # 461回目以降
num = 1

main_num_list = [] # 本数字6桁を格納するリスト
bonus_num_list = [] # ボーナス数字を格納するリスト

# PhantomJSをselenium経由で利用
driver = webdriver.PhantomJS()

while num <= 1241:
  
  # 第1~460回目までの当選ページのURL
  if num < 461:
    url = loto_url1 + str(num).zfill(4) + '.html'
  # 461回目以降当選ページのURL
  else:
    url = loto_url2 + str(num) + '_' + str(num+19) + '&type=loto6'
  
  # PhntomJSで該当ページを取得
  driver.get(url)
  time.sleep(2) # javascriptのページを読み込む時間
  html = driver.page_source
  
  soup = BeautifulSoup(html, "html.parser")
  print(soup.title)

  # ロト6の当選番号がのっているテーブルの取得
  table = soup.find_all("table")
  del table[0]

  for i in table:
    # 本数字の取得
    main_num = i.find_all("tr")[2].find("td")
    main_num_list.append(main_num.string.split(" "))

    # ボーナス数字の取得
    bonus_num = i.find_all("tr")[3].find("td")
    bonus_num_list.append(bonus_num.string)
    
  num += 20 # 次のページに移動するためにnumに20を追加
  time.sleep(random.uniform(1, 3)) # 1~3秒Dos攻撃にならないようにするためにコードを止める

# csvで出力
df = pd.DataFrame(main_num_list, columns = ['main1', 'main2', 'main3', 'main4', 'main5', 'main6'])
df['bonus'] = bonus_num_list
df.index = df.index + 1
df.to_csv('loto6.csv')



最後に


内容の中で何か分からないことがあればコメントで質問してください。答えられる範囲で答えます。

学習データを収集で来たので次の記事は機械学習を使って予測していきたいと思っています。深層学習を使うのならばRNNとか使うのがいいのかな。

SVRで予測する記事を書きました。
http://www.toshioblog.com/archives/16052074.html

Pythonのスクレイピングで分からないことがあれば以下の本が参考になると思うので読んでみてください。




↑このページのトップヘ