見出し画像

Python始めました。Webの表を一発で取得

いまにゅ先生のプログラミング塾

「【番外編】スクレイピングせずにWebページ上の表データを一瞬で取得する方法をわかりやすく解説!」を自分でもコードを書いてみることにしました。

先生の動画(6:40) の yahoo の表が変わっています!!!

'名称・コード・市場'が1つの文字列に・・・・
更に、
’取引値'は、'取引値','取引日'に、’前日比''前日比(円)','前日比(%)'
頭が真っ白になりました。@@;


Google先生に聞きまくって、ようやく自分なりの答えが出ました。

まずは、文字列の分割

① ['名称・コード・市場'] と ['前日比'] の 分割方法
   正規表現 (reモジュール)を使用
② ['取引値']  
の 分割方法
   桁数で分割( pandasの文字列の列にスライスを適用 )

次に、列データの一括処理

分割したい列をpandas の applyで関数を作成呼び出し、複数の値を返すようにしました。(表現、合ってるかな?・・・汗)


出来たコード(とりあえず動いた)

import pandas as pd
import re # 正規表現 (reモジュール)

def mks_re(x): # '名称・コード・市場' を分割
    mks_d=re.search(r'[0-9]{4}',x)  # 4桁の数字(コード)の位置を抽出
    dks_c = mks_d.group()       # コード
    dks_m = x[0:mks_d.start()]  # 名称
    dks_s = x[mks_d.end():-3]   # 市場 = 3文字マイナス「掲示板」
    return pd.Series([dks_m,dks_c,dks_s])

def tohi_re(x): # '取引値' を取引値・月日に分割
    tori_bi = x[-5:]
    tori_ti = x[:-5]
    return pd.Series([tori_ti,tori_bi])

def zen_hi(x): # '前日比' を、円・%に分割
    zen_hi =re.search(r'[+-]',x[1:]) # x[1:] 2文字目からサーチ
    en = x[0:zen_hi.start()+1]
    pa = x[zen_hi.start()+1:]
 return pd.Series([en,pa])
 
def bunkatu():
    df[['名称','コード','市場']] = df['名称・コード・市場'].apply(mks_re)
    df[['取引値','取引日']] = df['取引値'].apply(tohi_re)
    df[['前日比(円)','前日比(%)']] = df['前日比'].apply(zen_hi)
 
url_u = 'https://finance.yahoo.co.jp/stocks/ranking/up?market=all&term=daily' 
 
dfs = pd.read_html(url_u)
print(len(dfs)) # テーブルの数を確認
df = dfs[0] # 1つ目のテーブルを取得
bunkatu() # 繋がった文字列を分割
dfw = df.reindex(columns = ['順位', '名称','コード','市場', '取引値','取引日', '前日比(円)','前日比(%)', '出来高'])

dfw.to_excel('株価ランキング_値上がり率.xlsx')

出力結果はテキストです。
数値の変換はしていません。


上記のコードは動かなくなったのでブログで記事を書き直しました

おわり

サポートを頂けると、沢山記事が書けると思います。