Kohei Blog

夫・父親・医療系エンジニア

【スクレイピング】ナンバーズの当選番号を直近まで全件取得

今回もスクレイピングしていきます。

pythonを使ってのスクレイビング開発の依頼・外注 | Webシステム開発・プログラミングの仕事・副業 【クラウドソーシング ランサーズ】[ID:3468971]

mizuho銀行の宝くじ"ナンバーズ3"の1回目~直近の回の全データを取得したいです。 取得していただきたいデーターは↓ 「 '回別'(第1回) '当選日'(1994年10月7日) '抽選数字'(191) 」

ライブラリインポート

from bs4 import BeautifulSoup
import requests
import pandas as pd
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

url = 'https://www.mizuhobank.co.jp/retail/takarakuji/check/numbers/numbers3/index.html?year=2021&month=5'

op = Options()
op.add_argument("--headless");
op.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36')
op.add_argument('--lang=ja-JP')

直近の当選番号をデータフレームに格納

f:id:kei_01011:20210619071946p:plain

ナンバーズの当選番号はA表とB表に分かれているので、それぞれから収集していきます。

まずはA表から。

# (A表)先月から過去1年間の当せん番号 のリンクを格納した配列を返す
def backnumber_latest_link_to_lists():
    url = 'https://www.mizuhobank.co.jp/retail/takarakuji/check/numbers/backnumber/index.html'

    driver = webdriver.Chrome('/Users/user/driver/chromedriver',options=op)
    driver.get(url)
    res = requests.get(url)
    soup = BeautifulSoup(res.text,'html.parser')
    
    lists = []
    links = driver.find_elements_by_partial_link_text('ナンバーズ3')
    for link in links:
        lists.append(link.get_attribute('href'))
    
    return lists


backnumber_latest = backnumber_latest_link_to_lists()

# A表から回別、抽選日、抽選数字をDataFrameに変換 
backnumbers = []
for link in backnumber_latest:
    url = link

    driver = webdriver.Chrome('/Users/user/driver/chromedriver',options=op)
    driver.get(url)
    no = driver.find_elements_by_class_name('bgf7f7f7')
    date = driver.find_elements_by_class_name('js-lottery-date-pc')
    number = driver.find_elements_by_class_name('js-lottery-number-pc')


    for i in range(0,len(no)):
        backnumber = {}
        backnumber['回別'] = no[i].text
        backnumber['抽せん日'] = date[i].text
        backnumber['ナンバーズ3抽せん数字'] = number[i].text

        backnumbers.append(backnumber)
backnumber_df = pd.DataFrame(backnumbers)

過去の当選番号をデータフレームに格納


#Webドライバーのタイムアウト時間を10秒に設定
driver.implicitly_wait(10)

url = 'https://www.mizuhobank.co.jp/retail/takarakuji/check/numbers/backnumber/index.html'

driver.get(url)

backnumber_links = driver.find_elements_by_css_selector('.typeTK.js-backnumber-b tbody tr td a')

links = []

for item in backnumber_links:
    links.append(item.get_attribute('href'))

all_df = pd.DataFrame()

for i in range(0,len(links)):
    url = links[i]
    driver.get(url)

    # HTMLテーブルを取得
    df = pd.read_html(driver.page_source)[0]
    
    # append dataframe
    all_df = all_df.append(df, ignore_index=True)


# ナンバーズ4抽せん数字の削除 
all_df = all_df.drop(all_df.columns[[3]], axis=1)

全データを結合

df = pd.DataFrame()
df = df.append(all_df, ignore_index=True)
df = df.append(backnumber_df, ignore_index=True)

# 空白行の削除
df = df.dropna(how='all')

CSVデータで出力して完成。

f:id:kei_01011:20210619072600p:plain

今回も、1時間ほどで抽出できました。 案件の単価が1万円〜2万円なので、受注できていたとしたら、いいお小遣いですね!