Вы должны указать путь загрузки при использовании безголового режима в chromedriver. Также вам нужно дождаться загрузки файла. В приведенном ниже коде вы можете найти простой пример того, как ждать загрузки файла. Я использовал регулярное выражение, чтобы получить имя файла.
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
download_path = "your_download_path"
options = webdriver.ChromeOptions()
prefs = {
"profile.default_content_settings.popups": 0,
"download.prompt_for_download": False,
"download.directory_upgrade ": True,
'download.default_directory': download_path,
}
options.add_experimental_option('prefs', prefs)
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.headless = True
driver = webdriver.Chrome(options=options)
driver.set_window_size(1920, 1080)
driver.maximize_window()
wait = WebDriverWait(driver, 10)
spreadsheet_name = "Table 12. Labour force status by Sex, State and Territory - Trend, Seasonally adjusted and Original"
excel_xpath = f"//tr[contains(., '{spreadsheet_name}') and @class='listentry']//a[./img[contains(@alt, 'Excel')]]"
with driver:
driver.get('https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/6202.0Nov%202019?OpenDocument')
download_button = wait.until(EC.element_to_be_clickable((By.XPATH, excel_xpath)))
href = download_button.get_attribute("href")
# href of the file
# https://www.abs.gov.au/ausstats/meisubs.nsf/log?openagent&6202012.xls&6202.0&Time%20Series%20Spreadsheet&053D25DD395DF901CA2584D4001C70A5&0&Nov%202019&19.12.2019&Latest"
file_name = re.findall(r"(?<=openagent&)(.*?)(?=&)", href)[0]
download_button.click()
for i in range(60):
if not os.path.exists(f"{download_path}/{file_name}"):
time.sleep(1)
if not os.path.exists(f"{download_path}/{file_name}"):
print("Failed to download", file_name, href)