@velllum

Python selenium, как сделать проверку при загрузки загрузки файла в указанную директорию?

Вечер добрый уважаемые знатоки.
Есть парсер который собирает данные, а также грузит файлы в папку на диск ноута. средствами selenium
Есть загвоздка, файлы попадаются одни и те же (у разного типа товара одно и тоже описание), а размеры у них бывают не малинькие, и приходится ему их каждый раз качать по новой, а хотелось бы сночало реализовать проверку!.
Как сделать проверку при загрузки парсера, чтоб он проверял в папке есть такой файл или нет. Имя файла получить не могу, так как ссылка для загрузки, генерится при клике
ссылка на товар надо залогинеца, чтоб увидеть файл https://stomshop.pro/hlw-31-45b#tab-documentation

Пример моего куска кода загрузки файла

options = webdriver.ChromeOptions()

# options.add_argument(f"user-agent={user_agent.random}")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--headless")
options.add_experimental_option('prefs', {
    "download.default_directory": path_registration_documents,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True,
}
)

driver = webdriver.Chrome(
    executable_path=f"{base_path}/chromedriver",
    options=options
)

driver.find_element_by_id("tab-documentation-li").click()
    time.sleep(0.5)

    documents = driver.find_elements_by_class_name("docext-container")

    for document in documents:
        document.click()
        time.sleep(1)


Помогите или подскажите куда двигаться?

Заранее благодарю!
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Уверен, что в селениуме есть много специальных хендлеров и прочего, чтобы получать информацию о загружаемом файле и тд, но пока никто не видит предлагаю костыль: будем вручную формировать запрос для получения файла, и не выгружая запрос полностью доставать имя файла из заголовков ответа

import requests
import re
import os

#...

headers = {'Content-Type': 'application/x-www-form-urlencoded'}
documents = driver.find_elements_by_class_name("docext-container")

for document in documents:
    # тут ищем родительский элемент, в нем есть нужный нам ID
    document_id = document.find_element_by_xpath('..').get_attribute('data-documentation-id')
    # в пейлод вписываем нужные данные от формы, и вставляем наш ID
    payload='cr_documentation_action=download&documentation_id={}&email='.format(document_id)
    # url для запроса - текущая страница
    # ставим обязательно stream=True, чтобы файл не выкачивался сразу
    r = requests.post(driver.current_url, headers=headers, data=payload, stream=True)
    # название файлов всегда есть в заголовках запроса, response.headers
    # поэтому берем их, видим в нужном ключе "attachment; filename*=UTF-8''hlw-shiptsy-ortodonticheskie-reg.pdf"
    # ну и недолго думая дергаем регуляркой
    document_name = re.search(r'\'\'(.+?\.pdf)', r.headers['Content-Disposition']).group(1)

    # дальше уже нужно проверить наличие файла в папке
    # я так понял путь до папки с загрузками в переменной path_registration_documents, так что:
    if document_name in os.listdir(path_registration_documents):
        print('Не новый')
    else:
        print('Новый док')
        document.click()


Заголовков дополнительных в requests не вставлял, хватило только одного. Авторизация для этого тоже не нужна, но мало ли со временем изменится что нибудь - надо будет добавить.
Ну и os.listdir() нужно свой путь нормально указать, если вдруг неправильно. В общем идея ясна, дальше уже мои полномочия все
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы