Fehler beim Abkratzen von Daten zur Auswahl des DatumsPython

Python-Programme
Anonymous
 Fehler beim Abkratzen von Daten zur Auswahl des Datums

Post by Anonymous »

Ich versuche, Excel -Daten zu kratzen, indem auf der folgenden Seite auf mehrere Dropdown -Datum und Auswahldaten klicken. Habe meinen Python -Code unten reproduziert. Der Weblink, den ich versuche zu kratzen:
https://www.niftyindices.com/reports/historical-data
Also wähle ich zuerst P/E, P/B aus & Div.yield -Werte, dann wähle ich "Eigenkapital" dann "Nifty 500" im Index aus, wählte dann die aus und zu Daten aus und sendet dann. < /P>

Code: Select all

import os
import time
import traceback
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ✅ ChromeDriver Path
chrome_driver_path = r"C:\Users\abcd\Documents\chromedriver-win64\chromedriver.exe"

# ✅ Download directory
download_path = r"C:\Users\abcd\Downloads\Indices"

# ✅ Chrome Options
options = Options()
options.add_argument("--window-size=1920x1080")
options.add_argument("--disable-popup-blocking")
options.add_argument("--disable-blink-features=AutomationControlled")

# ✅ Initialize WebDriver
service = Service(chrome_driver_path)
service.start()
driver = webdriver.Remote(service.service_url, options=options)

driver.set_page_load_timeout(300)
wait = WebDriverWait(driver, 60)

try:
# ✅ Open the webpage
url = "https://www.niftyindices.com/reports/historical-data"
print("🔹 Opening webpage...")
driver.get(url)

# ✅ Wait for the page to fully load
time.sleep(5)

# ✅ Check if there's an iframe and switch to it
iframes = driver.find_elements(By.TAG_NAME, "iframe")
if iframes:
print("🔹 Switching to iframe...")
driver.switch_to.frame(iframes[0])  # Switch to the first iframe

# ✅ Select "P/E, P/B & Div. Yield values"
print("🔹 Clicking Historical Menu...")
menu_button = wait.until(EC.element_to_be_clickable((By.ID, "HistoricalMenu")))
menu_button.click()
time.sleep(2)

print("🔹 Selecting 'P/E, P/B & Div. Yield values'...")
div_yield_option = wait.until(
EC.element_to_be_clickable((By.XPATH, "//li[contains(text(), 'P/E, P/B & Div.Yield values')]"))
)
div_yield_option.click()
time.sleep(2)

# ✅ Select "Equity" from the dropdown
print("🔹 Selecting 'Equity' dropdown...")
equity_dropdown = wait.until(EC.element_to_be_clickable((By.ID, "ddlHistoricaldivtypee")))
Select(equity_dropdown).select_by_value("Equity")
time.sleep(2)

# ✅ Select "NIFTY 500" from the dropdown
print("🔹 Selecting 'NIFTY 500' dropdown...")
index_dropdown = wait.until(EC.element_to_be_clickable((By.ID, "ddlHistoricaldivtypeeindex")))
Select(index_dropdown).select_by_value("NIFTY 500")
time.sleep(2)

# ✅ Function to Select Date
def select_date(date_field_id, target_day, target_month, target_year):
print(f"🔹 Selecting date: {target_day}-{target_month}-{target_year}")

try:
# ✅ Check if date picker is inside an iframe
iframes = driver.find_elements(By.TAG_NAME, "iframe")
if iframes:
print(f"🔹 {len(iframes)} iframe(s) found.  Switching to first iframe...")
driver.switch_to.frame(iframes[0])
time.sleep(2)

# ✅ Wait for the date picker field to be clickable
date_field = wait.until(EC.element_to_be_clickable((By.ID, date_field_id)))

# ✅ Scroll into view if it's off-screen
driver.execute_script("arguments[0].scrollIntoView(true);", date_field)
time.sleep(1)

# ✅ Remove 'readonly' attribute (if applicable) to allow interaction
driver.execute_script("arguments[0].removeAttribute('readonly');", date_field)

# ✅ Click the date field to open the calendar
date_field.click()
time.sleep(2)  # Wait for the calendar to appear

# ✅ Select the year
year_dropdown = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "ui-datepicker-year")))
Select(year_dropdown).select_by_value(str(target_year))
time.sleep(1)

# ✅ Select the month
month_dropdown = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "ui-datepicker-month")))
Select(month_dropdown).select_by_value(str(target_month - 1))  # Month values are 0-indexed
time.sleep(1)

# ✅ Select the day
day_xpath = f"//td[@data-handler='selectDay'][@data-month='{target_month - 1}'][@data-year='{target_year}']/a[text()='{target_day}']"
day_element = wait.until(EC.element_to_be_clickable((By.XPATH, day_xpath)))
day_element.click()
time.sleep(2)

print(f"✅ Successfully selected {target_day}-{target_month}-{target_year}")

# ✅ Switch back to default content after selection
driver.switch_to.default_content()

except Exception as e:
print(f"❌ Error selecting date: {target_day}-{target_month}-{target_year}")
print(traceback.format_exc())

# ✅ Select the FROM date (01-Jan-2024)
select_date("datepickerFromDivYield", target_day=1, target_month=1, target_year=2024)

# ✅ Select the TO date (31-Jan-2025)
select_date("datepickerToDivYield", target_day=31, target_month=1, target_year=2025)

# ✅ Click Submit button
print("🔹 Clicking Submit button...")
submit_button = wait.until(EC.element_to_be_clickable((By.ID, "submit_buttonDivdata")))
submit_button.click()

# ✅ Wait for CSV download link
print("🔹 Waiting for CSV download link...")
csv_link = wait.until(EC.element_to_be_clickable((By.ID, "exporthistoricaldiv")))
csv_link.click()

# ✅ Wait for file download
print("🔹 Waiting for file download...")
time.sleep(15)

# ✅ Verify if file is downloaded
print("🔹 Checking downloaded files...")
files = os.listdir(download_path)
csv_files = [f for f in files if f.endswith(".csv")]

if csv_files:
print(f"✅ CSV file downloaded successfully: {csv_files[-1]}")
else:
print("❌ No CSV file downloaded.")

except Exception as e:
print(f"⚠️ An error occurred: {e}")
print(traceback.format_exc())

finally:
driver.quit()

< /code>
Der Fehler, den ich erhalte: < /p>
❌ Error selecting date: 1-1-2024
Traceback (most recent call last):
File "c:\users\am364971\documents\python scripts\download_nse_indices.py", line 84, in select_date
date_field = wait.until(EC.element_to_be_clickable((By.ID, date_field_id)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\AM364971\AppData\Local\anaconda3\Lib\site-packages\selenium\webdriver\support\wait.py", line 146, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

🔹 Selecting date: 31-1-2025
❌ Error selecting date:  31-1-2025
Traceback (most recent call last):
File "c:\users\am364971\documents\python scripts\download_nse_indices.py", line 84, in select_date
date_field = wait.until(EC.element_to_be_clickable((By.ID, date_field_id)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\AM364971\AppData\Local\anaconda3\Lib\site-packages\selenium\webdriver\support\wait.py", line 146, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

🔹 Clicking Submit button...
🔹 Waiting for CSV download link...
⚠️ An error occurred: Message:

Traceback (most recent call last):
File "c:\users\am364971\documents\python scripts\download_nse_indices.py", line 136, in 
csv_link = wait.until(EC.element_to_be_clickable((By.ID, "exporthistoricaldiv")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\AM364971\AppData\Local\anaconda3\Lib\site-packages\selenium\webdriver\support\wait.py", line 146, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Bitte helfen Sie beim Debuggen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post