spreadsheetを一括でexcel形式にダウウンロードする【python自動化】(その3)
以前の記事で、SpreadSheetを自動で取得するコードを紹介しました。
ですが、あのコードには、最大45ファイルしか取得できない欠点がありました。なので、今回は、ファイル数を際限なくダウンロードできるよう改良いたしましたので共有いたします。
まだ、その1、その2を見ていない方はそちらから見ることをおススメします。
前提条件や導入方法などはそちらに書いてありますので、そちらから見れば、より確実に導入できるかと思います。
目次(クリックで読みたい部分にジャンプできます)
コード解説
さっそくコードを載せます。
# 時間を計るライブラリをインポート
import time
from selenium.webdriver.common.by import By
#from selenium.webdriver.common.by import By
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# ChromeのWebDriverライブラリをインポート
from selenium.webdriver.chrome import service as fs
import os ,json
def geturl(value):
count=len(getclassitem(value["driver"]))
if value["howmanyfile"] is None : value["howmanyfile"] = count
urlitem =getURLItem(value)
return urlitem
def getURLItem(geturlItemvalue):
driver = geturlItemvalue["driver"]
if geturlItemvalue["startfilenumber"] is None:num=1
else:num = geturlItemvalue["startfilenumber"]
hover = []
urlitem = []
for i in range(geturlItemvalue["howmanyfile"]):
#以下のclassの値が違うかもしれないので、「存在しない」エラーが出た場合サイトを確認してみてください。
hover=getclassitem(driver)
time.sleep(1)#ロードができていない場合、取得できない場合があるので、間隔をあけている
print(len(hover))#ここでhoverの数が0の場合は読み込めていないとき。対策は、time.sleepを長くするか、hoverが0以外の時にのみ処理を実行するか。
#以下while文の処理を追加
while len(hover)-1<num:
hover=getclassitem(driver)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(2)
hover=getclassitem(driver)
#追加処理ここまで
print(len(hover)-1,num)
hover[num-1].click()
title =driver.title
url = driver.current_url
print(title)
print(num,":", url)
urlitem.append({"url":url,"title":title})
driver.back()
time.sleep(2)#同様に間隔を空けている(hoverが0の時は再度処理をやり直すのを組み込んでも良い)
num = num + 1
return urlitem
def getclassitem(driver):
hover=driver.find_elements(By.XPATH,"//*[@class='docs-homescreen-list-item docs-homescreen-item-shared']")
return hover
#ChromeDriverのパスを指定
CHROMEDRIVER = "chromedriver.exe"
def SetDriver(value):
# ドライバー指定でChromeブラウザを開く
chrome_service = fs.Service(executable_path=CHROMEDRIVER)
options = Options()
#以下を加えないとエラーが出る。
#options.add_argument('--headless')
options.add_experimental_option('detach', True)
# プロファイルの保存先を指定
options.add_argument("--user-data-dir={}".format(value["user"]))
# 使用するプロファイルを指定
options.add_argument("--profile-directory={}".format(value["profile"]))
driver = webdriver.Chrome(service=chrome_service, options=options)
return driver
#保存先ファイルを指定
BASE_DIR = os.path.dirname(__file__)
SAVE_FILE = BASE_DIR + '\log.json'
#ログファイル(JSON形式)を読みだす
def load_data():
if not os.path.exists(SAVE_FILE):
return []
with open(SAVE_FILE, 'rt', encoding='utf-8') as f:
return json.load(f)
#ログファイルへ書き出す
def save_data(data_list):
with open(SAVE_FILE, 'wt', encoding='utf-8') as f:
json.dump(data_list, f)
#ログを追記保存
def save_data_append(value):
data_list = load_data()
data_list.append(value)
save_data(data_list)
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#※※※※※※※※※※※※※※※※※※ここからユーザー記入欄※※※※※※※※※※※※※※※※※※※※※※※※※※※
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#chrome://version/ を検索。プロフィールパスを転記。
driver = SetDriver({
"user":"C:/Users/anbuy/AppData/Local/Google/Chrome/User Data/",
"profile":"Default"
})
#ダウンロードするファイルの数を指定
filenum = 2
#何番目からダウンロードを始めるか。(Noneだと最初から。初期値は1。)
startfilenumber = None
#一度実行するとGoogleSpreedSheetの順番が変わるので注意する。
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#※※※※※※※※※※※※※※※※※※ここまでユーザー記入欄※※※※※※※※※※※※※※※※※※※※※※※※※※※
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
time.sleep(1)
# Chromeを開いてGoogleにアクセスする
driver.get('https://docs.google.com/spreadsheets/u/0/')
#時間を時間を置く。
time.sleep(1)
print("~~~~~~~~~~URL取得を開始します。~~~~~~~~~~~~~~~~")
urlitem = geturl({
"driver":driver,
"howmanyfile":filenum,
"startfilenumber":startfilenumber,
})
print("~~~~~~~~~~URLを{}個取得し終わりました。~~~~~~~~~~~~".format(filenum))
print("~~~~~~~~~~ダウンロード開始します。~~~~~~~~~~~~~~~~~")
#スクリーンショットを撮影したい場合
#driver.save_screenshot('selenium_schreenshot_test2.png')
for item in urlitem:
delete_url = re.sub(r'[^/]*$', '', item["url"]) + "export?format=xlsx"
if delete_url in load_data():
print("「{}」はダウンロード済みです。".format(item["title"]))
else:
save_data_append(delete_url)
print(delete_url)
driver.get(delete_url)
time.sleep(2.5)
# 画面を閉じる
driver.quit()
print("~~~~~~~~~~~ダウンロード完了しました。~~~~~~~~~~~~~~~~")
処理として追加したのは、以下の部分です。それ以外の部分は、その2と全く同じコードになっているので、そのまま使っていただければと思います。(もちろんこれを全コピーして書き換えても問題ないです。)
変更を入れた処理
変更を入れた部分は以下のコードになります。
while len(hover)-1<num:
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(2)
hover=getclassitem(driver)
ダウンロードしたい数が、実際に取得してきたURLの数より大きい場合は、スクロールするように設定しています。
まとめ
導入方法については、以下の記事も参考にしてみてください。
(Visited 6 times, 1 visits today)