python3 – загрузка URL с веб-страницей, на которой включён JavaScript

Вопрос или проблема

Я хотел бы скачать URL с помощью Python, но получаю следующий ответ:

К сожалению, веб-приложение jfrog работает некорректно без включенного JavaScript. Пожалуйста, активируйте его для продолжения

Как можно включить поддержку JavaScript?

import requests 

def download(url,username,apikey):
    filename = "dump.txt"
    s = requests.session() 
    resp = s.get(url,auth=(username, apikey)) 
    file_size = int(resp.headers.get('content-length', 0))
    length = 1024*1024*5
    total = 0
    if resp.status_code == 200:
        with open(filename, 'wb') as out:
            for chunk in resp.iter_content(length):
                total += length
                if file_size > 0:
                    print("[%.2f]\r"%(total/file_size),end="",flush=True)
                out.write(chunk)
    else:
        print(url)
        print("[*] ошибка загрузки:" + str(r.status_code))
        exit(0)
    print("файл сохранен как:",filename)
    return

def main():
    url = "https://artifactory.sample.com/sample"
    username="xxxx"
    apikey="yyyy"
    download(url,username,apikey)    
    return

main()

Подумайте о том, что будет делать веб-приложение jfrog для загрузки.

  1. запрос к серверу с именем пользователя и API ключом, сохранить сессию/куки и т.д.
  2. запрос к серверу с сессией/куками и т.д. через JavaScript, обновить сессию/куки и т.д.
  3. запрос на загрузку с сервера.

Затем отслеживайте запрос/ответ выше и реализуйте их с помощью Python.

Не уверен, что понял это правильно или нет. Надеюсь, это поможет вам.

Ответ или решение

Для скачивания веб-страниц, требующих выполнения JavaScript, с использованием Python, необходимо использовать библиотеки, которые имитируют работу браузера, поскольку стандартная библиотека requests не поддерживает выполнение JavaScript. В данном случае рекомендуется использовать библиотеку Selenium, которая позволяет управлять браузерами, такими как Chrome или Firefox, и выполнять все необходимые действия, включая реализацию JavaScript.

Ниже представлен пример кода, который решает вашу задачу:

Установка необходимых библиотек

Сначала необходимо установить библиотеку Selenium и драйвер браузера (например, ChromeDriver). Вы можете установить Selenium с помощью pip:

pip install selenium

Также вам потребуется установить ChromeDriver, который следует загрузить с официального сайта. Убедитесь, что версия драйвера соответствует установленной версии Google Chrome.

Пример кода

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time

def download(url, username, apikey):
    # Опции для безголового режима (неиспользования интерфейса)
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # Запуск без интерфейса
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")

    # Указываем путь к Chromedriver
    service = Service('/path/to/chromedriver')  # Укажите путь к chromedriver
    driver = webdriver.Chrome(service=service, options=chrome_options)

    try:
        # Открываем страницу
        driver.get(url)

        # Находим и вводим имя пользователя и API-ключ
        username_input = driver.find_element(By.NAME, 'username')  # Замените 'username' на фактическое имя
        api_key_input = driver.find_element(By.NAME, 'apikey')      # Замените 'apikey' на фактическое имя

        username_input.send_keys(username)
        api_key_input.send_keys(apikey)

        # Отправляем форму
        api_key_input.send_keys(Keys.RETURN)

        # Ждем, чтобы убедиться, что страница загрузилась
        time.sleep(5)  # Время ожидания может варьироваться в зависимости от скорости загрузки страницы

        # Здесь можно добавить дополнительный код для выполнения действий на странице, если это необходимо

        # Запуск скачивания
        download_link = driver.find_element(By.LINK_TEXT, 'Download')  # Замените текст на фактический текст ссылки
        download_link.click()

        # Возможно потребуется дополнительное время, чтобы завершить загрузку
        time.sleep(5)

    finally:
        driver.quit()

def main():
    url = "https://artifactory.sample.com/sample"
    username = "xxxx"
    apikey = "yyyy"
    download(url, username, apikey)

if __name__ == "__main__":
    main()

Объяснение кода

  1. Импорт библиотек: Мы используем selenium для управления браузером.
  2. Настройка ChromeDriver: Важно указать путь к ChromeDriver. Убедитесь, что он соответствует версии вашего браузера.
  3. Открытие URL: Запускаем браузер, открываем нужный URL, находим поля для ввода имени пользователя и API-ключа, заполняем их и отправляем форму.
  4. Скачивание файла: После успешного входа в систему необходимо нажать на ссылку для скачивания, дождавшись завершения загрузки.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...