86363


Python selenium でダウンロードしてきたファイルを指定したディレクトリに保存したいです．  
↓サイトを参考にしましたが“Downloads”フォルダに入ってしまいます．  
<https://qiita.com/KWS_0901/items/33ae052e2e4694a6b4f1>  
↓サイトの方法を試しましたが解決しませんでした．  
[https://ja.stackoverflow.com/questions/61642/seleniumでダウンロードしてきたファイルをデスクトップに保存したい](https://ja.stackoverflow.com/questions/61642/selenium%E3%81%A7%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%81%8D%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%9F%E3%81%84)

具体的な目標:
Google検索でfiletype:pdfを使ってPDFのURLを収集して，requestsで直接ダウンロードして，requestsでダウンロードできなかったファイルをseleniumでダウンロードする

気づいたこと: PDFのURLは少なくとも2種類に分けられます．  
1\. クリックした瞬間ダウンロードのポップアップが出るもの  
2\. 印刷しないとダウンロードが始まらないもの  
1.のURLの末尾には“php?”が含まれていることが多いです．下記スクリプトで1.をダウンロードするときは指定したディレクトリにダウンロードされますが，同じスクリプトで2.をダウンロードすると“Downloads”に保存されます．1.のダウンロードの際にChromeの左下にダウンロードバーが表示されますが2.ではダウンロードバーは表示されません．

paramsの設定が部分的に適応されていることから—kiosk-printingに問題があるように感じます．

環境:  
macOS 12.3 Beta  
Python 3.9.9  
selenium 4.1.0  
Google Chrome 98.0.4758.102 (Official Build) (x86_64)  
chromedriver 98.0.4758.80 (webdriver_manager)

以下スクリプト

[code]

    # https://qiita.com/KWS_0901/items/33ae052e2e4694a6b4f1
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome import service as fs
    from selenium.webdriver.chrome.options import Options
    #from pathlib import Path
    import os
    import time
    import json
    
    # 保存対象URL一覧取得
    urls = []
    with open('urls.txt', mode='rt', encoding='utf-8') as f:
        urls = f.readlines()
    
    # Chrome の印刷機能でPDFとして保存
    #options = webdriver.ChromeOptions()
    options = Options()
    
    # PDF印刷設定
    appState = {
        "recentDestinations": [
            {
                "id": "Save as PDF",
                "origin": "local",
                "account": ""
            }
        ],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "pageSize": 'A4'
    }
    
    downloadsFilePath = ''
    
    # ドライバへのPDF印刷設定の適用
    """
    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState": json.dumps(appState),
        "download.default_directory": downloadsFilePath,
        'download.prompt_for_download': False,
        "download.directory_upgrade": True,
        'safebrowsing.enabled': True
    })
    """
    
    prefs = {}
    prefs['download.default_directory'] = os.path.abspath(downloadsFilePath)# + r"/"
    prefs['printing.print_preview_sticky_settings.appState'] = json.dumps(appState)
    #prefs['download.prompt_for_download'] = False
    prefs['download.directory_upgrade'] = True
    #prefs['safebrowsing.enabled'] = True
    options.add_experimental_option('prefs', prefs)
    options.add_argument('--kiosk-printing')
    
    #with webdriver.Chrome("./chromedriver", options=options) as driver:
    with webdriver.Chrome(service=fs.Service(executable_path=ChromeDriverManager().install()),options=options) as driver:
        # 任意のHTMLの要素が特定の状態になるまで待つ
        wait = WebDriverWait(driver, 15)
        for url in urls:
            driver.implicitly_wait(10)
            driver.get(url)
            # ページ上のすべての要素が読み込まれるまで待機
            wait.until(EC.presence_of_all_elements_located)
            # PDFとして印刷
            driver.execute_script('return window.print()')
            # 待機
            time.sleep(10)
        driver.quit()
    
[/code]


CC BY-SA 4.0
2022-02-15T03:13:19.050
86347
2022-02-15T08:06:53.223
50898
question
python google-chrome selenium pdf
Python seleniumでPDFを好きなディレクトリに保存したい


Windows10の環境では、コメントで紹介した以下の記事にあった`savefile.default_directory`を設定することで指定したディレクトリにPDFファイルを保存することが出来ました。  
[how to make headless chrome support
window.print?](https://stackoverflow.com/q/60463587/9014308)  
[Save as PDF using Selenium and
Chrome](https://stackoverflow.com/q/61798725/9014308)

質問の紹介記事に掲載されていたプログラムで`chromedriver.exe`のパスを自分の環境に合わせたのと、  
[[Python]Seleniumを利用したWebページのPDF保存方法
メモ](https://qiita.com/KWS_0901/items/33ae052e2e4694a6b4f1)

以下の部分の`download.default_directory`の行を

[code]

    # ドライバへのPDF印刷設定の適用
    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState":
        json.dumps(appState),
        "download.default_directory": '~/Downloads'
    })
    
[/code]

こんな風に`savefile.default_directory`と指定のディレクトリに変えただけです。

[code]

    # ドライバへのPDF印刷設定の適用
    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState":
        json.dumps(appState),
        "savefile.default_directory": r'C:\WebSiteLog'
    })
    
[/code]

試してみてください。


CC BY-SA 4.0
2022-02-15T08:06:53.223
86363
2022-02-15T08:06:53.223
26370
86347
answer