サイトを巡回してファイルをダウンロードする 【Python】

Python

ネット上に CSV ファイルなどの URL が公開されているとき、その URL をテキストファイルに書き出しておくと、各サイトを巡回してダウンロードをするスクリプトについてまとめ、公開しておきます。
ファイル名に日付をつけて保存することなどもできるようにします。

環境:Windows パソコン、Python 3 (requests のインストール済み)

背景 ~ 手作業が増えていくのを改善したい

ネット上にあるファイルをダウンロードすることはいくらでもあると思います。
通常は、手動で一度だけダウンロードすれば終わりです。

ところが、株価、経済指標、天気などのデータのように、一定期間おきにファイル内のデータが更新されるものがあります。

ファイルの内容が更新されていくと、サイトへのアクセスとダウンロード操作の繰り返し作業が発生します。
また、ファイルの内容が更新されてもファイル名が同じ場合、過去に保存したファイルを開いて確認していかないことには内容がわからなくなります。時間の経過に応じて内容が変わるのであれば、ファイル名に日付や時刻をつけて保存したくなります。
ネット上にこうしたファイルが多数あって、月々また日々更新されていくとなると、同じような作業を何度も繰り返す必要が生じ、自分の将来の時間がどんどん奪われていくことになります。

ということで、ネット上にあるファイルの URL をテキストファイルに書き出しておくと、自動で順次ダウンロードするスクリプトをまとめ、公開しておくことにします。

定期的にダウンロードするファイルの URL を追加していくことで、以後、繰り返しの手作業を解消できるようになります。
また、URL 部分にカンマ区切りでファイル名を指定しておくと、日付つきのファイル名などとして保存できるようにします。

設定手順

① 以下を参考に、ダウンロードの作業用のフォルダを作成してください。
c:\user\download_files1
② ①のフォルダ内に “download1” という名前でフォルダを作ってください。ダウンロードしたファイルを保存するためのフォルダです。
③ ①のフォルダ内に download_files1.py という名前でテキストファイルを作り、下記のサンプルスクリプトを貼りつけて保存してください。
④ ①のフォルダ内に download_list1.txt という名前でテキストファイルを作り、下記のサンプルを貼りつけて保存してください。

※ なお、ダウンロード用のテキストファイル download_list1.txt に記載したサンプルは、「日経平均プロフィル」と「IR BANK」を参照させていただいております。日経平均株価、上場銘柄の損益計算書、貸借対照表などを扱う例です。
各サイトへのアクセスは、各サイトの利用規約に従う必要があります。加えて、頻繁なアクセスは避ける、時間を空けてアクセスするなど、サーバーの負荷を配慮する必要があります。ご理解いただきますようお願いします。

使い方

⑤ コンソールを起動して ② のスクリプトを実行してください。
例: python c:\user\download_files1\download_files1.py

→ ④の “download1” フォルダ内にファイルがダウンロードできたら成功です。

ダウンロード用のテキストファイル download_list1.txt の記載について
・ サンプルを参考に、ダウンロードしたいファイルの URL をテキストファイル download_list1.txt に記載してください。記載されたファイルについて、冒頭から順次、ダウンロードします。
・ 各行において、URL のみを記載したときは、その URL に記載されたファイル名(オリジナルのファイル名)で保存します。
・ URL のあとに “, ” (カンマ+半角スペース)を入れて、ファイル名を追記したときは、その追記したファイル名で保存します。
例: https:xxxx.csv, abc.csv
→ abc.csv という名前で保存します。
・ 追記したファイル名に “yymmdd” という文字列を入れた場合は、その部分を年月日に書き換えて保存します。
例: https:xxxx.csv, yymmdd_abc.csv
→ 241201_abc.csv という名前で保存します。
・ 追記したファイル名に “yymm” という文字列を入れた場合は、その部分を年月(例:”2411″)に書き換えて保存します。
例: https:xxxx.csv, yymm_abc.csv
→ 2412_abc.csv という名前で保存します。
・ 保存するファイル名について、すでに “download1” フォルダ内にそのファイルがあった場合は、ダウンロードの処理をスキップします。(サーバーの負荷を減らすためです。)
・ download_list1.txt で、途中に空行があった場合は、空行のところでダウンロードを終了します。
ダウンロードが不要なファイルなどを空行以降に移すことで、実用上柔軟な運用ができるようにしています。
・ 日付つきのファイル名で保存することで、スクリプトを複数回実行したとき、すでにそのファイルがあればダウンロードをスキップし、月日が更新されたときだけダウンロードを実行する、といった動きをさせることが可能です。

うまく動いたら

・ うまく動いたら、③のテキストを編集して、ダウンロードしたい任意のファイルの URL に書き換え、活用してみてください。
複数のサイトを順次回ってファイル名に日付をつけて保存していくことなどが可能となります。

・ 一例として、ダウンロードしたデータを使って、データ分析、グラフの描画、機械学習などの処理をする場合は、まず、オリジナルのファイルは日付をつけて保存だけしていくようにします(編集はしない)。
そして、オリジナルのファイルを参照し、別フォルダにファイルを連結して余計な記載を削除するなど、整形したファイルを生成するようにする、とすると効率的です。
下記の関連リンクに株価予測をしたサンプルなども挙げてありますので、興味のある方は参照してみてください。

スクリプトの説明

・ 冒頭で requests をインポートしています。ファイルのダウンロードのためです。
・ def donwload_file1 () としたところで、指定した URL にアクセスし、得られたファイルを指定したファイル名で保存する関数を定義しています。
・ def get_url_and_filename1 () としたところで、donload_list1.txt ファイルを読み込んで、URL と保存するファイル名を取得する関数を定義しています。
・ 末尾の for ループで、download_list1.txt から得られた URL にアクセスし、ファイルを順次保存しています。
ファイルがすでに存在する場合は、ダウンロード処理をスキップするようにしています。
また、ダウンロードの実行後、sleep() を入れてサーバーへの負荷を軽減するようにしています。
必要により、内容を調整してください。

まとめ

テキストファイルで URL を書き出しておくと、自動でダウンロードする Python のスクリプトについてまとめました。
各サイトを回ってダウンロードをするなどの手作業を解消することが可能です。
他にも、ファイル名を一括で変換するスクリプトなどもまとめています。関心のある方は参照してみてください。

関連リンク
・ 一括でファイルを移動する 【Python】
・ 一括で日付つきファイル名に変換する 【Python】
・ 
指定したサイトマップからリンクを抽出する 【Python】
・ ウェブ検索と結果の取得を自動化する【Python & selenium】
・ 指定した URL からリンクを抽出する 【Python】
・ 機械学習で株価予測 【Python】
・ Webスクレイピング時のパッケージの使い分け 【requests vs. selenium】

外部リンク
・ 日経平均プロフィル 日経平均株価
・ IR BANK 

サンプルスクリプト

ファイルをダウンロードするスクリプト download_files1.py

import os 
import requests as rq1 
from datetime import datetime as dt1 
import time as tm1 

def read1( file1 ): 
    str1 = ""
    with open( file1, 'r', encoding='utf-8' ) as f1: 
        str1 = f1.read() 
    return str1 

def write1( file1, str1 ): 
    with open( file1, 'w', encoding='utf-8' ) as f1: 
        f1.write( str1 ) 
    return 0 

def get_a1( file1 ): 
    a1 = read1( file1 ).strip().split( "\n" ) 
    for i1 in range( len(a1) ): 
        a1[i1] = a1[i1].split( ", " ) 
    return a1 

def yymmdd1(): 
    now1 = dt1.now() 
    yy1 = now1.strftime("%y") 
    mm1 = now1.strftime("%m")
    dd1 = now1.strftime("%d")
    yymmdd2 = f"{yy1}{mm1}{dd1}"
    yymm2 = f"{yy1}{mm1}"
    return yymmdd2, yymm2 

def download_file1( url1, file1 ): 
    res1 = rq1.get(url1)
    if res1.status_code == 200:
        with open(file1, 'wb') as f:
            f.write(res1.content)
    return res1 

def get_url_and_filename1( file1 ): 
    a1 = get_a1( file1 ) 
    yymmdd0, yymm0 = yymmdd1() 
    a2 = [] 
    for i1 in range(len(a1)): 
        url1  = a1[i1][0].strip().replace("\\", "/") 
        if "https:" in url1: 
            if len(a1[i1]) > 1: 
                file2 = a1[i1][1].strip() 
            else: 
                file2 = url1.split( "/" )[-1] 
            file3 = file2.strip().replace( "yymmdd", yymmdd0 ).replace( "yymm", yymm0 ) 
            a2.append([ url1, file3 ] )
        else: 
            break
    return a2 

path1 = os.path.dirname(__file__) + "/" 

file0 = path1 + "download_list1.txt" 
a1 = get_url_and_filename1( file0 ) 

for i1 in range(len(a1)): 
    url1 = a1[i1][0] 
    file1 = a1[i1][1]
    file2 =  path1 + "download1/" + file1 
    if os.path.isfile( file2 ): 
        print( "file exists: " + file1 ) 
    else: 
        print( "download: " + file1 + " " + url1 ) 
        download_file1( url1, file2 ) 
        tm1.sleep(2) 




設定ファイル download_list1.txt

※ 下記の “https” と “://” の間に入れた半角スペースは削除してください。サイトの表示の都合上、下記のように記載しています。
※ また、3行目のつぎに空行が入れてあります。スクリプトを実行すると空行を見つけたところで終了します。うまく動いたら、空行を削除して実行してみてください。柔軟にカスタマイズできるよう意図しています。


https ://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_daily_jp.csv, nikkei_yymmdd.csv 
https ://f.irbank.net/files/0000/fy-profit-and-loss.csv, 0000_all_PL1_yymm.csv
https ://f.irbank.net/files/0000/fy-balance-sheet.csv, 0000_all_BS1_yymm.csv

https ://f.irbank.net/files/7203/fy-profit-and-loss.csv, 7203_toyota_PL1_yymm.csv
https ://f.irbank.net/files/7203/fy-balance-sheet.csv, 7203_toyota_BS1_yymm.csv

タイトルとURLをコピーしました