Pythonを使っていると複数のコードで共通して使用しているコードがあることに気付きます。その作業を完全に覚えていればいいのですが毎回ウェブで調べてコードを記述して、とすると目的の作業は同じなのにシートごとにコード記述方法が違ってしまい見にくくなってしまいます。
そんなことを解消するのが「Pythonチートシート」です。
今回は「 Seleniumで指定フォルダにダウンロード + ファイルを指定のフォルダに移動する 」コードを紹介します。
◆ Mac OS
◆ Python 3
◆ JupyterLab
◆ Selenium Chromedriver
想定する利用シーン

Pythonで自動でウェブ上からファイルをダウンロードして、指定のフォルダに保存したいなぁ

デフォルトのダウンロードフォルダには色々なファイルが入っているから、そこから移動したいファイルだけを探すのが大変。。

PythonのSeleniumで定期的にサイトの最新情報をダウンロードして、指定のフォルダに保存したいという場合に使用できるコード例です。今回はウェブページ上で「ファイルをクリックしてダウンロード」する場合のコードです。
前準備 フォルダの作成
このコードの実行によりファイル名を読み込むフォルダ・ファイルはこのJupyterLabで作成した「.ipynb」ファイルとの相対パスで場所を示します。
今「.ipynb」を保存しているフォルダと同じ階層に「download」と「output」というフォルダを作成してください。
任意のフォルダ - .ipynb (ファイル) - download (フォルダ) - output (フォルダ)
今回はこちらのtest用webページ中にある「test1.txt」という名のテキストファイルをダウンロードします。

コード: Seleniumで指定フォルダにダウンロード + ファイルを指定のフォルダに移動する
それでは実際に「 Seleniumで指定フォルダにダウンロード + ファイルを指定のフォルダに移動する 」コードを紹介します。この作業を行うには「Selenium」「Shutil」「glob」を使用します。
### STEP0:初期設定
import time # スリープを使うために必要
from selenium import webdriver # Webブラウザを自動操作する(python -m pip install selenium)
import chromedriver_binary # パスを通すためのコード
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options # オプションを使うために必要
option = Options() # オプションを用意
option.add_argument('--incognito') # シークレットモードの設定を付与
# seleniumでのダウンロード先のフォルダの設定(※必ずフルパスとすること)
download_path = '/Users/mark/Jupyter Lab/00_Cheat Sheet/download'
## NG例
# download_path = '/download'
option.add_experimental_option("prefs", {"download.default_directory": download_path})
browser = webdriver.Chrome(options=option) # Chromeを準備(optionでシークレットモードにしている)
### STEP1:指定のURLにアクセス
url = "https://life100create.com/python-selenium-test/"
browser.get(url)
time.sleep(1)
### STEP2:ファイルのダウンロード
file_link = browser.find_element_by_id("download_text")
file_link.click()
time.sleep(1)
### STEP3:ブラウザを閉じる
browser.quit()
### STEP4:ワイルドカードを含んだファイルの移動(関数の設定)
import shutil
import glob
import os
def move_file(newpath, oldpath, recursive=True):
for p in glob.glob(oldpath, recursive=recursive):
shutil.move(p, newpath)
### STEP5:ワイルドカードを含んだファイルの移動(関数の実行)
move_file(newpath = './output/download_test.txt'
, oldpath = download_path+'/*.txt')
実行結果
任意のフォルダ - .ipynb (ファイル) - download (フォルダ) - output (フォルダ) -- download_test.txt
上記のコードを実行することで、指定のウェブページからダウンロードしたテキストファイルを「download」フォルダに保存し、その後download_test.txtとファイル名を変更して「output」フォルダに保存することができました。
コードの解説
以下に各コードごとの処理について解説していいきます。
Seleniumでデフォルトのダウンロード先を変更
以下の「STEP0:初期設定」でSeleniumによるダウンロード先を変更しております。今回「Selenium」ではchromedriverを使用しています。ダウンロード先を変更するのは、option.add_experimental_option("prefs", {"download.default_directory": download_path})でoptionに設定でき上記コード中のdownload_pathに保存先の絶対パスを指定します。
### STEP0:初期設定
import time # スリープを使うために必要
from selenium import webdriver # Webブラウザを自動操作する(python -m pip install selenium)
import chromedriver_binary # パスを通すためのコード
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options # オプションを使うために必要
option = Options() # オプションを用意
option.add_argument('--incognito') # シークレットモードの設定を付与
# seleniumでのダウンロード先のフォルダの設定(※必ずフルパスとすること)
download_path = '/Users/mark/Jupyter Lab/00_Cheat Sheet/download'
## NG例
# download_path = '/download'
option.add_experimental_option("prefs", {"download.default_directory": download_path})
browser = webdriver.Chrome(options=option)
実行結果
別ウィンドウで、Chromeがシークレットウィンドウ表示で立ち上がれば成功です。
Chromeのダウンロード先の変更確認方法
Seleniumで開いたChrome中の設定でダウンロード先を確認することができます。
①右上の「メニュー」から「設定」をクリック

②「詳細設定」から「ダウンロード」をクリック

③保存先が確認できます。

Seleniumでパスを指定する際には絶対パスを使用すること
このとき、Jupyter Lab / notebookと同じように「相対パス」で記載してしまうと、Chromeからはそのパスにたどり着けないため「絶対パス(フルパス)」を指定するようにしてください。
Seleniumでファイルダウンロード (クリック)
次にこちらのtest用webページへSeleniumでアクセスして、ページ中にある「test1.txt」という名のテキストファイルをクリックすることでダウンロードします。
このファイルはクリックすることでダウンロードできる設定のため、file_link = browser.find_element_by_id("download_text")でダウンロード対象のファイルを指定し file_link.click()でクリックすることがダウンロード操作となります。
time.sleep(秒数)としてわざと実行時の時間に余裕分を持たせることでエラーなく処理を進めることができます。### STEP1:指定のURLにアクセス
url = "https://life100create.com/python-selenium-test/"
browser.get(url)
time.sleep(1)
### STEP2:ファイルのダウンロード
file_link = browser.find_element_by_id("download_text")
file_link.click()
time.sleep(1)
### STEP3:ブラウザを閉じる
browser.quit()
実行結果
任意のフォルダ - .ipynb (ファイル) - download (フォルダ) -- test1.txt - output (フォルダ)
上記のコードを実行することで、指定のウェブページからダウンロードしたテキストファイル「test1.txt」を「download」フォルダに保存することができました。
この後、そのファイルをdownload_test.txtとファイル名を変更して「output」ファイルに移動させます。
datetime.strftimeでdatetimeからstr変換
「shutil」「glob」モジュールを使用してファイル名の変更とフォルダ移動を行います。move_file()関数を定義し、「ワイルドカード(*)」で定義した拡張子「.txt」を含むファイルを指定したフォルダ(ここでは「output」)に移動し、その際にファイル名もdownload_test.txtと変更しております。
### STEP4:ワイルドカードを含んだファイルの移動(関数の設定)
import shutil
import glob
import os
def move_file(newpath, oldpath, recursive=True):
for p in glob.glob(oldpath, recursive=recursive):
shutil.move(p, newpath)
### STEP5:ワイルドカードを含んだファイルの移動(関数の実行)
move_file(newpath = './output/download_test.txt'
, oldpath = download_path+'/*.txt')
実行結果
任意のフォルダ - .ipynb (ファイル) - download (フォルダ) - output (フォルダ) -- download_test.txt
上記のコードを実行することで、指定のウェブページから「download」フォルダに保存していたテキストファイルを、その後download_test.txtとファイル名を変更して「output」フォルダに保存することができました。
最後に
「Pythonチートシート」で毎回よく使う作業のPythonコードをまとめ、今回は「Seleniumで指定フォルダにダウンロード + ファイルを指定のフォルダに移動する」コードを紹介しました。
他にもいろいろなチートシートを用意しておりますので以下から確認してみてください。




コメント
[…] Seleniumで指定フォルダにダウンロード + ファイルを指定のフォルダに移動する […]