Ответы пользователя по тегу Python
  • Как пофиксить selenium.common.exceptions.StaleElementReferenceException Selenium python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    появляется ошибка selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found. Как от нее избавиться?

    Ошибка возникает тогда, когда ранее полученный элемент - устарел (изменен, удален итп).

    Understanding Stale Element Reference Exception in... (на java внимание не обращаем, там главное суть понять).
    Ответ написан
    Комментировать
  • Как проверить наличие поля в JSON файле с помощью python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Применять метод .get() к строке не лучшее решение, попробуйте так:
    for item in response.json()['Employees']:
        first_name = item["User"]["FullName"]["FirstName"]
        last_name = item["User"]["FullName"]["LastName"]
        
        if "MiddleName" in item["User"]["FullName"]:
            middle_name = item["User"]["FullName"]["MiddleName"]
        else:
            middle_name = "отчество отсутствует"
        
        print(f"Имя: {first_name}, фамилия: {last_name}, отчество: {middle_name}")
    
    
    # Имя: Иван, фамилия: Иванов, отчество: Иванович
    # Имя: Петр, фамилия: Петров, отчество: отчество отсутствует
    Ответ написан
    Комментировать
  • Как проверить в списке чисел наличие числа, содержащего цифру 3?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    nums = list(map(int, input("Введите числа: ").split()))
    
    if any('3' in str(n) for n in nums):
        print("Найдено")
    else:
        print("Не найдено")
    Ответ написан
    Комментировать
  • Как выйти из бесконечной работы браузера при парсинге через Selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Нейронка это конечно хорошо, но желательно проверять, что она пишет:
    # EC.presence_of_element_located((By.CSS_SELECTOR, "product-slider__img js-product-current-img"))
    EC.presence_of_element_located((By.CSS_SELECTOR, ".product-slider__img.js-product-current-img"))

    Ниже код для Chrome и FF (Python 3.10, Windows 11 Pro 23H2) - все прекрасно работает, за исключением сайта-помойки, который грузится минуту:
    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 WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    
    options = Options()
    service = Service(r'D:\project\chromedriver-130.0.6723.93.exe')
    driver = webdriver.Chrome(service=service, options=options)
    
    url = 'https://superstep.ru/product/NCFSW0W288YW_GRA/#colorGRA'
    driver.get(url)
    
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".product-slider__img.js-product-current-img"))
        )
        page_html = driver.page_source
        print(page_html)
    
    except TimeoutException:
        print("Элемент не найден")
    
    finally:
        print('Программа завершена')
        driver.quit()

    from selenium import webdriver
    from selenium.webdriver.firefox.service import Service
    from selenium.webdriver.firefox.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 selenium.common.exceptions import TimeoutException
    
    options = Options()
    service = Service(r'D:\project\geckodriver.exe')
    driver = webdriver.Firefox(service=service, options=options)
    
    url = 'https://superstep.ru/product/NCFSW0W288YW_GRA/#colorGRA'
    driver.get(url)
    
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".product-slider__img.js-product-current-img"))
        )
        page_html = driver.page_source
        print(page_html)
    
    except TimeoutException:
        print("Элемент не найден")
    
    finally:
        print('Программа завершена')
        driver.quit()

    672b4890b03b0937030403.png
    Ответ написан
    2 комментария
  • Как правильно воспользоваться документацией API к сайту и исполнить методы в Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    1. Получить your_secret_key, скорее всего в ЛК этого сайта.
    2. Вставить из примера ссылку в браузер и перейти, подставив вместо your_secret_key полученный ключ из п1, вместо остальных - в API руководстве написано, что нужно.
    3. В результате, "в браузер вернется json объект" с данными от сервера, которые так же указаны в API руководстве.

    4. Затем, пишем Python код, будем использовать синхронный requests (как самый простой):
    import requests
    
    # Подставить нужные данные из API руководства
    params = {
        'key': '?',
        'hash_name': '?',
        'id': '?',
        'price': '?',
    }
    
    # GET запрос на сервер, аналог того, что мы использовали в браузере из п2.
    response = requests.get('https://rust.tm/api/v2/buy', params=params)
    
    # Печатаем результат запроса, аналог того, что мы использовали в браузере из п3.
    print(response.json())
    
    # В консоль распечатается приблизительно это:
    
    # {
    #   "success": true,
    #   "id": "136256960"
    # }
    
    # Затем нужно циклом обойти результат с сервера и уже на основание полученных данных - предпринять необходимые действия. Например, пойти пожрать, чем я сейчас как раз и займусь... ;)

    P.S. специально написал ответ максимально простым языком, и не вижу смысла писать более сложные код и рассказывать про виртуальное окружение, т.к. скорее всего Вы в любом случае пойдете гуглить эти проблемы.

    P.P.S. код, ошибки и ссылки на api нужно писать текстом, а не скринами, не нарушайте правила сервиса!
    Ответ написан
    1 комментарий
  • Как ускорить обработку POST запроса Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    8-10 секунд уходит, это не дело, как можно исправить?

    Переписать сервер, код которого Вы разумеется не предоставили.
    Ответ написан
    1 комментарий
  • Регистрация на Twitch с использованием Selenium вызвать ошибку «Ваш браузер не поддерживается". Что делать?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Nodriver, официальная замена undetected-chromedriver.
    Ответ написан
    Комментировать
  • Анимированная загрузка с многоточием, как сделать?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Комментировать
  • Как сделать вывод сообщения в определённую секунду?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    import time
    
    # Время берется 1 раз в момент запуска скрипта, чему оно будет равно?
    now = datetime.now() 
    current_time = now.strftime("%H:%M:%S")
    
    # Цикл запущен и проверяет время, которое было взято 1 раз выше, что получится? Получится то, что цикл будет искать время, которое уже истекло.
    while True:
        time.sleep(1)
        if current_time == '16:49:00':
            print('text')
    
    # Так, щас 16:49:00?
    # Ок, ждем 1 сек...
    # Так, щас 16:49:01?
    # Ок, ждем 1 сек...
    # Так, щас 16:49:02?
    # У нас время идет вперед или назад..? Если все таки вперед, то сможет ли оно достигнуть current_time, которое уже меньше, чем ожидаемое время..?

    print() в помощь, чтобы понимать, что происходит в коде, если до полноценной отладки пока далеко:
    import time
    from datetime import datetime
    
    while True:
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
    
        if current_time == '17:15:00':
            print('text')
            time.sleep(1)
        else:
            print(f'Нихуа ({current_time})!')
            time.sleep(1)
    
    # Нихуа (17:14:56)!
    # Нихуа (17:14:57)!
    # Нихуа (17:14:58)!
    # Нихуа (17:14:59)!
    # text
    # Нихуа (17:15:01)! <--- Вот здесь оказывается Ваш первоначальный скрипт
    # Нихуа (17:15:02)!
    # Нихуа (17:15:03)! <--- Мы ждем какое время, 16:49:00?

    P.S. Ваш код все таки сработает, когда пройдут сутки, но я не думаю, что так было задумано ;)
    Ответ написан
    2 комментария
  • Как устранить дублирование кода?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как вариант (>=Python3.10):
    from typing import Dict, Any
    
    def process(answer, result_json: Dict[str, Any]) -> None:
        tmp_json = parse_answer(answer)
        result_json['summary_text'] += tmp_json['result']
        result_json['tags'].extend(tmp_json['tags'])
        result_json['input_size'] += answer.input_size
        result_json['output_size'] += answer.output_size
    
    def handler(text: str, max_size: int) -> Dict[str, Any]:
        result_json = {'summary_text': '', 'tags': [], 'input_size': 0, 'output_size': 0}
    
        match len(text):
            case size if size > max_size:
                chunker = TextChunker(maxlen=max_size)
                for chunk in chunker.chunk(text):
                    answer = get_answer(chunk, tags_quantity=1)
                    process(answer, result_json)
            case _:
                answer = get_answer(text, tags_quantity=3)
                process(answer, result_json)
    
        return result_json
    Ответ написан
    2 комментария
  • Если любой из элементов массива слов имеется в строке - выдать true, как?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    list = ['Да', 'да', 'интересно', 'Интересно']
    input = input("Введите текст: ")
    
    if any(w in input for w in list):
        print('Одно из слов есть в тексте')

    или:
    list = ['Да', 'да', 'интересно', 'Интересно']
    input = input("Введите текст: ")
    
    match input:
        case _ if any(w in input for w in list):
            print('Одно из слов есть в тексте')
        case _:
            print('Здесь нет таких')
    Ответ написан
    8 комментариев
  • Как эмулировать согласие на обработку данных?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    данный код не работает

    Конечно не работает, Вы обращаетесь к свойству click (которого не существует), а не к методу click().
    # driver.find_element("xpath", "//input[@id='LinkDa']" ).click
    driver.find_element("xpath", "//input[@id='LinkDa']" ).click()

    Полный вариант:
    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get('https://autoins.ru/osago/raschet-stoimosti-osago/proverit-kbm/')
    
    # Debug
    time.sleep(10)
    
    checkbox = driver.find_element(By.XPATH, '//label[@for="linkDa"]')
    checkbox.click()
    
    # Debug
    time.sleep(10)
    
    button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "btnDa"))
    )
    
    button.click()
    
    # Debug
    time.sleep(10)
    
    driver.quit()
    Ответ написан
    Комментировать
  • Что делать с пайтоном на телефоне?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что делать с пайтоном на телефоне?

    Ничего.
    Ответ написан
    Комментировать
  • Как парсить debank?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Баланс формируется динамически, request не может его получить. Выбор: парсить на питоне с aiohttp, asyncio, bs4 или requests + bs4?
    Ответ написан
  • Какие библиотеки использовать для разработки бэкенда python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Flask / django / restapi?

    Django - больше комьюнити, больше документации, больше вакансий и работы в целом. Практически все необходимые компоненты из коробки, плюс/минус общая структура разных проектов.
    Что из этого проще в освоении

    То, о чем больше написано различной документации, втч. и к компонентам и где больше разработчиков, которые в случае чего подскажут.
    Что из этого ... эффективнее.

    Эффективность бывает разная, скорость разработки - Django, производительность самого фреймворка - FastAPI. Периодически, используют сразу оба, где FastAPI обрабатывает нагруженные участки приложения, а Django занимается всем остальным.
    Ответ написан
    Комментировать
  • Что изучать python backend разработчику?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что изучать python backend разработчику?

    Вы не совсем верно ставите задачу, не "что изучать", а "какие инструменты выбрать для этой задачи". Если под "python backend разработчику" понимается классическая backend разработка, по типу сервера, для каких либо приложений, то:
    1. Как сделать, чтобы по указанному url отдавалась html страница с таким то данными? Django Writing views. В процессе работы Вы начнете понимать, для чего нужны какие то вьюхи и модели.
    2. Оказалось, что в п1. неудобно вставлять всю страницу, что делать, если мне нужно сделать более сложную html страницу? Используем один из самых популярных шаблонизаторов Jinja for Server-Side Rendering in Django.
    3. Как и где хранить данные? Пробуем SQLite. В процессе работы Вы начнете понимать, для чего нужны какие то ORM.
    4. Выяснилось, что п3 не подходит для моего проекта (почему конкретно?), где еще хранить данные? Пробуем PostgreSQL.
    5. Как сделать простое API на Django? Используем Django REST framework (DRF) или Django Ninja.
    6. Как создать возможность аутентификации пользователей и показ им именно их личной информации? How to use sessions, JWT.
    7. Как быть, если мне приходит запрос с фронта и мне нужно быстро вернуть ответ, а не ждать, пока бэк все обработает? Django Background Tasks.
    8. Задач стало очень много, Django не тянет, надо выполнять все в фоне, п6. уже не подходит (почему конкретно?), что делать? Django Celery.
    9. Как развернуть мой мега сайт на хостинге? Shared хостинг (если VDS много, это жестко конечно, но хозяин - барин). Для VDS идем гуглить, в каком порядке и что надо ставить.
    10. Как сделать автоматическое развертывание несколько проектов на удаленном сервере и нужно ли оно мне (описываем, что, где и в каком порядке нужно развернуть)? Docker + CI/CD.

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

    Так же можно гуглить по типу Django Roadmap 2024.
    Ответ написан
    2 комментария
  • Как подключиться к OpenVPN через python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Почему код написанный на python работает некорректно?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Знаю, что быдло код, просьба не критиковать , так как я только учась! :)

    А как Вы научитесь, если Вас не будут критиковать?
    Почему не парсит остальные страницы?

    Вас не смущает, что root находится в другой области видимости?
    while cout_page < 8:
      # ...
      root = soup.findAll('span',{'class':'label label-default'})
    
    for i in root:
      tage.append(i.text)

    Вот так работает:
    import requests
    from bs4 import BeautifulSoup
    
    start_page = 1
    last_pages = 8
    
    tags = []
    
    for page in range(start_page, last_pages + 1):
        url = f"https://cs-ms-monitoring.ru/all-servers/page/{page}/"
        res = requests.get(url)
    
        if res.status_code == 200:
            soup = BeautifulSoup(res.text, "lxml")
            root = soup.find_all('span', {'class': 'label label-default'})
            tags.extend([tag.text for tag in root])
        else:
            print(f"Ошибка на странице {page}")
    
    with open("base.txt", "w") as file:
        for tag in tags:
            file.write(tag + "\n")

    КартинкО

    66bc90f85ce5e092912425.png
    66bc90fcd10ad137906749.png
    Ответ написан
  • Как исправить ошибку при попытке создать файл в функции и затем его открыть?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Мне необходимо создавать и записывать данные в новый файл

    Читать 1 файл (mode='r') можно неограниченному количеству скриптов единовременно.

    Чтение с возможностью записи (w, a или r+):
    - В винде файл может блокироваться первым читающим, остальные сосут чупик.
    - В линуксе возможно не блокирование файла, но могут возникнуть проблемы с записью, если не реализован механизм синхронизации.

    Самое простое - использовать контролируемую блокировку файла на уровне скрипта, который взаимодействует с файлами (fcntl==linux, msvcrt==win):
    import fcntl
    
    with open('file.txt', 'a') as f:
        fcntl.flock(f, fcntl.LOCK_EX)  # файл кем то заблокирован, ждем
        try:
            f.write("Some data\n")  # файл разблочился, блокируем его и работаем с ним
        finally:
            fcntl.flock(f, fcntl.LOCK_UN)  # что то пошло не так, снимаем блокировку с файла принудительно
    Ответ написан
    Комментировать
  • Selenium: почему не находит элементы внутри элемента в LOOP?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Необходимо использовать относительные пути в XPATH:
    # h2= g.find_element(By.XPATH, '//h2').text
    h2 = g.find_element(By.XPATH, './/h2').text
    Ответ написан
    2 комментария