手元の環境は Python 3.12.3/Selenium 4.31.1/Chromedriver 128.0.6613.137 です。そちらは Selenium 3.14.1 とのことなので、以下のサンプルコードは適宜書き換える必要がありますが、想定する動作にはならないかもしれません。
この保存先をページごとに異なるフォルダにしたい
保存先のフォルダを selenium.webdriver.chromium.webdriver.ChromiumDriver.execute_cdp_cmd — Selenium 4.24.0 documentation で指定します。(コードでは適当に /path/to/download_??
としています) ダウンロードの完了については JavaScript で監視していて(browser.execute_script(...)
)、60秒でタイムアウトします。(WebDriverWait(browser, 60, 2).until(complete_every_downloads)
) ダウンロード処理に時間が掛かる場合は、タイムアウト値を増やす必要があります。
python
1 from selenium import webdriver
2 from selenium . webdriver . chrome . options import Options
3 from selenium . webdriver . common . by import By
4 from selenium . webdriver . support . ui import WebDriverWait
5 from selenium . webdriver . support import expected_conditions as EC
6
7 def complete_every_downloads ( browser ) :
8 if not browser . current_url . startswith ( 'chrome://downloads/' ) :
9 browser . get ( 'chrome://downloads/' )
10 return browser . execute_script ( """
11 items = document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList').items;
12 if (items.length == 0) return false;
13 return items.every(e => e.state === 2);
14 """ )
15
16 options = Options ( )
17 options . add_experimental_option ( 'prefs' , { 'plugins.always_open_pdf_externally' : True } )
18 browser = webdriver . Chrome ( options = options )
19 browser . implicitly_wait ( 10 )
20
21 urls = [
22 'https://.../' ,
23 'https://.../' ,
24 ]
25
26 for i , url in enumerate ( urls ) :
27 browser . execute_cdp_cmd ( 'Page.setDownloadBehavior' , {
28 'behavior' : 'allow' ,
29 'downloadPath' : f'/path/to/download_ { i : 02d } '
30 } )
31
32 browser . get ( url )
33 links = browser . find_elements ( By . CLASS_NAME , 'File' )
34 for link in links :
35 link . click ( )
36
37 WebDriverWait ( browser , 60 , 2 ) . until ( complete_every_downloads )
38
39 browser . quit ( )