이제 웹 스크래핑을 사용하여 로또 6 데이터를 얻습니다.

서버 필요없이 무료로 웹 스크래핑을 할 수 있다고 듣고 시도했다.
소재가 없으면 아무래도 동기가 나지 않기 때문에, 조금이라도 동기가 나도록 이번에는 로또 6의 데이터를 취득하고
정말 무작위입니까? 라고 검증을 실시했다.

colab



우선 colab 에 등록하고 ファイルPython3のノートブック하드웨어를 GPU로 변경

colab는 매번 닫으면 전부 넣은 것이 없어지므로 매번 설치가 필요
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin

!pip install selenium
!pip install beautifulsoup4

스크래핑 부분



여러가지 조사했지만 제대로 움직이지 않았기 때문에
여기 를 참고해 코드를 수정.
Chrome의 자동 조작으로 취득하기로 했다.
import time
import random
import pandas as pd
from selenium import webdriver
+ from selenium.webdriver.chrome.options import Options
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()
+ # ブラウザをheadlessモード(バックグラウンドで動くモード)で立ち上げてwebsiteを表示、生成されたhtmlを取得し、BeautifulSoupで+ 綺麗にする。
+ options = webdriver.ChromeOptions()
+ # 必須
+ options.add_argument('--headless')
+ options.add_argument('--disable-gpu')
+ options.add_argument('--no-sandbox')
+ # エラーの許容
+ options.add_argument('--ignore-certificate-errors')
+ options.add_argument('--allow-running-insecure-content')
+ options.add_argument('--disable-web-security')
+ # headlessでは不要そうな機能
+ options.add_argument('--disable-desktop-notifications')
+ options.add_argument("--disable-extensions")
+ # 言語
+ options.add_argument('--lang=ja')
+ # 画像を読み込まないで軽くする
+ options.add_argument('--blink-settings=imagesEnabled=false')
+ driver = webdriver.Chrome('chromedriver',options=options)
while num <= 1341:

  # 第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のページを読み込む時間
+ # 途中から取得先のサイトが非同期になってるため、遅延時間を変更
+ time.sleep(5)
  html = driver.page_source.encode('utf-8')
  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')

이 처리가 끝나면 파일 탭에 loto6.csv 가 오고 있을 것이며, 갱신을 하면 나온다.

그래프로 데이터 보기


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv('loto6.csv') #ヘッダーをヘッダーにしたまま取得
df = df.drop("Unnamed: 0", axis=1) #1列目を削除

nums_all = df[['main1','main2','main3','main4','main5','main6','bonus']]

plt.rcParams['figure.figsize'] = (8, 6)# 以降の図のデフォルトサイズ
plt.rcParams["font.size"] = 15
#tes = nums_all.values.flatten().size # 個数
tes = (nums_all.sum().sum())/(nums_all.size) # 平均

plt.hist(nums_all.values.flatten(), bins=43, normed=True)
plt.show()
tes

결론





평균은 22, 히스토그램도 별로, 예쁘게 장미 하고 있네요.
이것은 기계 학습등으로 여러가지 해도 낭비라고 생각해 버렸다.

좋은 웹페이지 즐겨찾기