見出し画像

CSVを読んでCSVを書き出す

探せば似たような記事は沢山あると思うが自分の勉強ようにまとめ

Pythonでのスクレイピングは大体把握した!

後やりたい事はデータ集めてAI学習させて株価が上がるか下がるかってやつを来年中に出来ればいいかなぁとぼんやり思っている(°_°)
もうやりたい事が...学習意欲低下中w


Pythonで全上場企業のCSVを読みヤフーファイナンスの企業情報から
特色と上場年月日をスクレイピングしてCSVを書き出す

読み込み用CSVの作り方

1.全上場企業のコードと社名を簡単にCSV化

EDINETコードリストダウンロード
・上場後1営業日経過の会社がCSV化されている
・上場区分でフィルタ(非上場企業も多数含まれるため)
・コードで昇順
・=LEFT(B2,4)関数で4文字抽出(5桁あるため)
・コピーして値のみ貼付

画像5

JPXデータダウンロード
・月末締めなので当月分は含まれず

又はオリジナルのCSVでも可

どれでもOKだが
コードの見出し列名に 証券コード と付ける
・列は何列目でもかまわない
以上でCSVのデータが読み込まれる

実行時の確認(一応あった方がどこまで進んでいるかがわかる)

画像3

出力CSVの確認、必要ない時は14行目のprintをコメントアウトか削除

画像1

PANDASで確認、必要ない時は4行目のdfをコメントアウトか削除

画像2


プログラム

コメントやスペースが多いから長く感じるが実際のコードは32行だけ
Pythonはソースも短くわかりやすくプログラム自体は簡単だが、ライブラリが多く、どんな種類や中身か分かっていないので中々完全理解には程遠いが、取り敢えず簡単なスクレイピングが出来る程度には理解した

画像6

※ Tabは4つがお約束らしいのでコピペでずれてる場合は修正して下さい

# 必要ライブラリインポート
import requests
from bs4 import BeautifulSoup
from time import sleep
import pandas as pd
import os

# ディレクトリ変更(Python用、任意なのでやらなくてもOK、読み書きするCSVファイルはここに)
os.chdir("/content/drive/My Drive/Colab Notebooks")     # (グーグルドライブのマウント必要)

# CSVファイル読み込み
df = pd.read_csv("EdinetcodeDlInfo.csv", encoding="ms932", sep=",")
# コードを変数名コード_リストに代入
Code_list = df["証券コード"]

# 関数:項目テキスト抜き出し
def Code_Items():
   # soup.select("cssセレクタ")# CSSセレクターを使って指定した場所のtextを表示
   selector = ".boardFinCom"
   soup.select_one('.boardFinCom').text
   #print(soup.select_one(selector))#.prettify()
   # 欲しい情報のタグで.find_all('???')又は.find()
   Item = soup.select_one(selector).find_all('td')
   # 開始 0 から [???] 番目指定で欲しい情報をTEXTで抜き出し
   Item1 = Item[0].text
   Item2 = Item[10].text
   # 項目をリストにセット
   Items[i] = Item1,Item2
   print(Code,Item1,Item2)

# 辞書・リストを作成   Items = {}辞書 = []リスト
Items = {}
Items[0] = "項目1","項目2"

# 読み込んだコードを i に代入してコード終了までループ
for i in Code_list:
   # HTMLアクセス・解析
   url = "https://stocks.finance.yahoo.co.jp/stocks/profile/?code={}".format(i)
   res = requests.get(url)
   soup = BeautifulSoup(res.text, "html.parser")
   # 銘柄コード
   Code = i
   # 項目
   try:
       Code_Items()    # 項目テキスト抜き出し関数
   except:
       print("Err",i)
   # 待機(秒)
   sleep(1)

# PANDASで確認
df = pd.DataFrame(Items).T  # Transposeの頭文字(行列転換)
df.sort_values(0)           # コード順にソート
df

# CSVファイル書き出し   行:, header = False   列:, index = False
df.to_csv("CsvInOut.csv", header = False, encoding="utf-8-sig")

前回のIMPORTXMLと同じ様にXPathを使って場所を特定するやり方もあるみたいだけど、そのやり方はまた違うライブラリを使ってやるみたいなので、
今回はCSSセレクターを使って場所を指定するやり方でやってみた

やり方は途中までIMPORTXML同様で最後XPathの2つ上のCSSセレクターを選んでコピペするだけだが、サイトの構造によってそのまま上手く行く場合と、table構造になっている場合は上手くいかないみたいなので、その場合はclassだけ指定して、後はその中から td の [何番目] みたいに必要なテキストを抽出する感じ

新しいビットマップ イメージ


サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶