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)