Selenium – не удалось загрузить документPython

Программы на Python
Ответить
Anonymous
 Selenium – не удалось загрузить документ

Сообщение Anonymous »

В настоящее время я работаю над веб-скребком, и каждый раз, когда я пытаюсь щелкнуть или получить с его помощью ссылку на определенную ссылку, это не дает мне абсолютно ничего.
Однако я попробовал и должен обратите внимание, что когда я сам захожу на веб-сайт, ссылка, по которой мне нужно щелкнуть, работает и данные доступны, но когда я использую свой веб-скребок, почему это не происходит?

Код: Выделить всё

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
import urllib.request
import os

WEBSITE_URL = 'https://www.i-de.es/conexion-red-electrica/produccion-energia/mapa-capacidad-acceso'
BUTTON_COOKIE_XPATH = '//*[@id="onetrust-accept-btn-handler"]'
BUTTON_AVISO_XPATH = '//*[@id="MapaCapaciadaModalButton"]/span[1]'
BUTTON_PDF_XPATH = '//*[@id="portlet_com_liferay_journal_content_web_portlet_JournalContentPortlet_INSTANCE_aVVDHaAKM4S6"]/div/div/div/div/div/p/a'
DOWNLOAD_PATH = '/path/to/download/directory'
PROFILE_PATH = 'my personal path to my chrome profile'

def setup_driver(profile_path: str = None) -> webdriver.Chrome:
chrome_options = Options()
if profile_path:
chrome_options.add_argument(f"user-data-dir={profile_path}")
chrome_options.add_experimental_option("prefs", {
"download.default_directory": DOWNLOAD_PATH,
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"safebrowsing.enabled": True
})
driver = webdriver.Chrome(options=chrome_options)
return driver

def wait_and_click(driver: webdriver.Chrome, by: By, value: str):
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((by, value))
)
element.click()

def get_pdf_url(driver: webdriver.Chrome) -> str:
pdf_link_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, BUTTON_PDF_XPATH))
)
url = pdf_link_element.get_attribute('href')
if not url:
raise ValueError("Failed to retrieve the PDF URL")
return url

def download_pdf(url: str, download_path: str) -> str:
local_pdf_path = os.path.join(download_path, "downloaded_file.pdf")
urllib.request.urlretrieve(url, local_pdf_path)
sleep(10)
if not os.path.isfile(local_pdf_path):
raise FileNotFoundError("PDF file was not found after downloading")
return local_pdf_path

def main():
driver = setup_driver()

try:
driver.get(WEBSITE_URL)
sleep(10)
wait_and_click(driver, By.XPATH, BUTTON_COOKIE_XPATH)
wait_and_click(driver, By.XPATH, BUTTON_AVISO_XPATH)
pdf_url = get_pdf_url(driver)
downloaded_pdf_path = download_pdf(pdf_url, DOWNLOAD_PATH)
print(f"PDF downloaded to: {downloaded_pdf_path}")
finally:
driver.quit()

if __name__ == "__main__":
main()
Как видите, это не очень большой парсер, и мне нужно, чтобы только этот файл был описан как «BUTTON_PDF_XPATH».
Итак, я попробовал кое-что чтобы исправить это, например, используя мой профиль Chrome с веб-скребком, что иногда приводило к появлению ошибки: Err_HTTP2_Protocol_Error, бесконечная загрузка, пока не истечет время ожидания или в некоторых случаях он загружал веб-сайт, но мог щелкнуть ни на чем (я могу вас заверить, что вся XPATH работает).
Я также пытался замедлить работу парсера с помощью Sleep(), но в результате это заставило меня просто ждать ничего, или я даже пытался щелкнуть по нему напрямую, но это просто заставляло меня уйти.
Наконец, я захотел попробовать использовать такой аргумент, как :options.add_argument('--disable-http2') для Err_HTTP2_Protocol_Error, но я не знаю, как его использовать.

Подробнее здесь: https://stackoverflow.com/questions/789 ... d-document
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»