Я хочу скачать миллионы файлов Excel с веб-сайта, используя селен. Мой текущий код пытается обработать проблемы с ElementNotVisibleException, но мои методы «попробуй и исключи», похоже, не дотягивают.
Я попытался внедрить решение «попробуй и кроме», где, если появляется сообщение об ошибке, я дал указание Selenium ждать, пока не появится «кнопка».
import os
import time
import csv
from tqdm import tqdm
import pandas as pd
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import ElementNotVisibleException
from selenium.common.exceptions import ElementClickInterceptedException
working_directory = r"xx"
os.chdir(working_directory)
options = webdriver.ChromeOptions()
prefs = {
"download.default_directory": r"xx",
"download.prompt_for_download": False,
"download.directory_upgrade": True}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(r"C:xxx\chromedriver.exe", options = options)
driver.get("website")
# Login
driver.find_element_by_class_name("smallLoginBox").click()
driver.implicitly_wait(1)
time.sleep(2)
driver.find_element_by_id('loginFormUC_loginEmailTextBox').send_keys('EMAIL')
driver.find_element_by_id('loginFormUC_loginPasswordTextBox').send_keys('PASWORD')
driver.find_element_by_xpath("//input[@value='Logg inn']").click()
# Get a custom list of firms
bedrifter = []
with open("./listwithIDs.csv") as csvDataFile:
csvReader = csv.reader(csvDataFile)
for row in csvReader:
bedrifter.append(row[0])
# THE LOOP
for ID in tqdm(bedrifter_gjenstår):
driver.get("website" + ID)
source = driver.page_source
if not "Ingen data" in source: # make sure there is an excel file. If not, loop continues to next ID.
# first click on button "download excel"
try:
driver.find_element_by_id("exportExcel").click()
except ElementNotVisibleException:
WebDriverWait(driver, 120).until(
EC.presence_of_element_located((By.ID, "exportExcel")))
driver.find_element_by_id("exportExcel").click()
except ElementClickInterceptedException:
WebDriverWait(driver, 120).until(
EC.presence_of_element_located((By.ID, "exportExcel")))
driver.find_element_by_id("exportExcel").click()
# second click, choosing what format the excel file should be in
try:
driver.find_element_by_id("mainContentPlaceHolder_mainContentPlaceHolder_mainContentPlaceHolder_AccountingNumberTableUc_excelLinkButton").click()
except ElementNotVisibleException:
WebDriverWait(driver, 120).until(
EC.presence_of_element_located((By.ID, "mainContentPlaceHolder_mainContentPlaceHolder_mainContentPlaceHolder_AccountingNumberTableUc_excelLinkButton")))
driver.find_element_by_id("mainContentPlaceHolder_mainContentPlaceHolder_mainContentPlaceHolder_AccountingNumberTableUc_excelLinkButton").click()
# code to switch between windows to remove download window and continue the code
try:
window_export = driver.window_handles[1]
except IndexError:
time.sleep(3)
print("sleep")
window_export = driver.window_handles[1]
try:
window_main = driver.window_handles[0]
except IndexError:
time.sleep(3)
print("sleep")
window_main = driver.window_handles[0]
driver.switch_to.window(window_export)
driver.close()
driver.switch_to.window(window_main)
Я ожидаю, что код загрузит все файлы, если они есть, но появится либо ElementNotVisibleException, либо ElementClickInterceptedException.