Ответы пользователя по тегу Python
  • Что учить Python бэкенд разработчику?

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

    1. Django для большинства проектов, FastAPI для остальных, т.к. Flask стремительно проигрывает рынок FastAPI:
    - https://blog.jetbrains.com/pycharm/2023/12/django-...
    - https://lp.jetbrains.com/python-developers-survey-2022/
    2. БД mysql/postgresql.
    3. Очереди по типу Celery.
    4. Asyncio.
    Ответ написан
    Комментировать
  • Как прописать пограничный случай в коде?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    def has_char(string, char):
        i = 0
        while i < len(string):
            if char == string[i].lower():
                return True
            if char == string[i].upper():
                return True
            i += 1
        return False
    
    print(has_char('Hello', 'h'))  # True
    print(has_char('Hello', 'H'))  # True
    print(has_char('Hello', 'ё'))  # False, ;)

    Сравнение char с string[i] без учета регистра?
    def has_char(string, char):
        for i in range(len(string)):
            if char == string[i]:
            # if char.lower() == string[i].lower():
                return True
        return False
    
    print(has_char("Привет", "п"))  # True? False!

    И да, в Вашем случае, for будет лучше while, т.к. цикл не предполагает неопределенное количество итераций, читается лучше, да и сами проверки можно упростить:
    def has_char(string, char):
      for _char in string:
        if _char.lower() == char.lower():
          return True
      return False
    
    print(has_char('Hello', 'h'))  # True
    print(has_char('Hello', 'H'))  # True
    print(has_char('Hello', 'ё'))  # False, ;)
    Ответ написан
    1 комментарий
  • Как нажать кнопку на сайте пика через селениум?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как нажать кнопку на сайте пика через селениум?

    4.6. Locating Elements by Class Name

    Вместо By.CLASS_NAME (можно передать лишь 1 наименование класса), используйте By.CSS_SELECTOR (можно передать любой селектор):
    # pahe = driver.find_element(By.CLASS_NAME, 'sc-gsnTZi fWJuXR').click()
    pahe = driver.find_element(By.CSS_SELECTOR, '.sc-gsnTZi.fWJuXR').click()


    И, если есть минутка - на скок понял это проверка сертификатов - как это поправить можно? (куда посмотреть)
    [8468:12460:0214/095050.752:ERROR:ssl_client_socket_impl.cc(974)] handshake failed; returned -1, SSL error code 1, net_error -101
    [8468:12460:0214/095050.866:ERROR:ssl_client_socket_impl.cc(974)] handshake failed; returned -1, SSL error code 1, net_error -101

    Проблемы с ssl соединением (handshake failed).
    Ответ написан
    Комментировать
  • Как сделать скрин отрывка в Selenium Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Сохраняем скрин всей страницы, затем вырезаем нужное из этого скрина:
    $ pip install --upgrade webdriver-manager
    $ pip install Pillow

    from selenium import webdriver
    from selenium.webdriver.edge.service import Service
    from PIL import Image
    from webdriver_manager.microsoft import EdgeChromiumDriverManager
    
    driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
    driver.get("https://pillow.readthedocs.io/en/stable/installation.html")
    path = "full.png"
    driver.save_screenshot(path)
    driver.quit()
    
    x = 100
    y = 100
    w = 500
    h = 300
    
    image = Image.open(path)
    cropped = image.crop((x, y, x+w, y+h))
    cropped.save("crop.png")

    КартинкО

    65cc62a645be7633087189.png
    65cc62ac23be7654822496.png
    65cc62b0ef884076037417.png

    Но обычно отправляют сразу изображение капчи (оно обычно в html в style как base64 вставлено), ничего не вырезая.
    Ответ написан
    2 комментария
  • Как передать собственный класс на метод в качестве параметра по умолчании?

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

    Можно ли такое осуществлять? Или такое не стоит сделать даже если возможно?

    Можно. Не стоит.

    Значение аргументов по умолчанию в функции вычисляется в момент объявления функции, а не в момент обращения к ней.

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

    Также, Ваш код приведет к ошибке, так как в момент определения метода test класс Test еще не полностью определен, и Вы не можете создать его экземпляр.

    Вместо этого, можно использовать None для аргумента по умолчанию, а внутри метода проверять, был ли передан аргумент, и если нет, то создавать новый экземпляр класса:
    class Test:
        def test(self, x=None):
            if x is None:
                x = Test()
            print(type(x))
    
    x = Test()
    x.test()

    Поделитесь целью использования такой схемы?
    Ответ написан
    4 комментария
  • Как ограничить количество подключений прокси в Pyrogram?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    в Pyrogram документации не нашел подобного

    Все верно, Pyrogram не настолько гибкий по прокси, в сравнение с Telethon. Используйте внешний менеджер подключений/проксей и не будите зависеть от конкретной библиотеки, например:
    import asyncio
    from pyrogram import Client
    from pyrogram.errors import PyrogramError
    
    class ProxyManager:
        def __init__(self, app, max_retries=5, retry_delay=1, proxy=None):
            self.app = app
            self.max_retries = max_retries
            self.retry_delay = retry_delay
            self.proxy = proxy
            self.client = None
    
        async def connect(self):
            for attempt in range(1, self.max_retries + 1):
                try:
                    print(f"Connection attempt #{attempt}")
                    self.client = Client(**self.app, proxy=self.proxy)
                    await self.client.start()
                    print("The connection was established successfully.")
    
                except PyrogramError as e:
                    print(f"Connection error: {e}")
                    if attempt == self.max_retries:
                        print("The maximum number of connection attempts has been reached, stop!")
                        break
    
                    await asyncio.sleep(self.retry_delay)
    
        async def disconnect(self):
            if self.client:
                await self.client.stop()
                print("Connection is closed.")
    
    app = {
        'api_id': 'YOUR_API_ID',
        'api_hash': 'YOUR_API_HASH',
        'session_name': 'your_session_name'
    }
    
    proxy = {
        'scheme': 'http',  # or 'socks5'
        'hostname': 'your.proxy.hostname',
        'port': 1080,
        'username': 'user',
        'password': 'password'
    }
    
    # test run
    async def main():
        manager = ProxyManager(app, max_retries=3, retry_delay=2, proxy=proxy)
        await manager.connect()
        await manager.disconnect()
    
    asyncio.run(main())
    Ответ написан
    1 комментарий
  • Как я могу выявить вредоносный код на python?

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

    Своими глазами я вряд ли увижу, то чего стоило бы опасаться.

    Найти того, кто сможет.
    Есть ли какие то инструменты для выявления того, чего не должно быть в коде?

    Антивирус? Но врятли на python пишут вирусы, а все остальное на вирусы не тянет, но данные утащить может.
    Ответ написан
    3 комментария
  • Как получить индексы строк в openpyxl?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    https://openpyxl.readthedocs.io/en/latest/api/open...
    Обход всех строк на листе и вывод индекса каждой первой ячейки:
    from openpyxl import load_workbook
    
    wb = load_workbook('sheet.xlsx')
    sheet = wb.active
    
    for row in sheet.iter_rows():
        for cell in row:
            print(cell.row)
            break
    Ответ написан
    Комментировать
  • Как пофиксить ошибку с TeleBot?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    С моим токеном работает:
    import telebot
    
    bot = telebot.TeleBot("TOKEN")
    
    # handler /start
    @bot.message_handler(commands=['start'])
    def start_message(message):
        bot.send_message(message.chat.id, 'Йоу')
    
    bot.polling(none_stop=True)
    Ответ написан
    Комментировать
  • Ошибка 403 при парсинге сайта?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Обнаружил некую защиту "на лоха", а значит request и обычный selenium не справятся, буду использовать selenium + selenium-stealth (пример от сюда) + chrome + socks5 (рабочий, на момент теста):
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options
    from selenium_stealth import stealth
    
    proxy = '45.132.75.19:23820'
    
    options = Options()
    options.add_argument('--proxy-server=socks5://' + proxy)
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument("window-size=1920,1080")
    # options.add_argument("--incognito")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-plugins-discovery")
    options.add_argument("--start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    
    executable_path = './chromedriver-121.0.6167.85.exe'
    
    service = Service(executable_path=executable_path)
    driver = webdriver.Chrome(service=service, options=options)
    
    stealth(driver,
            languages=["en-US", "en"],
            vendor="Google Inc.",
            platform="Win64",
            webgl_vendor="Intel Inc.",
            renderer="Intel Iris OpenGL Engine",
            fix_hairline=True,
            run_on_insecure_origins=True,
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36',
            )
    
    try:
        driver.get('https://allegro.pl/kategoria/laptopy-491')
        time.sleep(30)
        print(driver.page_source)
    finally:
        driver.quit()

    Chromedriver качать здесь, он должен совпадать с мажорной версией Вашего Chrome браузера, который будет использовать Selenium.

    65c1e056ad6db620469150.png
    Ответ написан
    Комментировать
  • Как забрать html код со страницы?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Пытался забрать html простым реквестом, получалась не очень

    попробовал через selenium - получил то же самое

    Не spa, не ajax и защиты нет, а значит request вполне справится, ниже рабочий пример, который печатает всю html страницу (российские ip блочат (403), использовал рабочий socks5):
    import requests
    import socks
    import socket
    
    socks.set_default_proxy(socks.SOCKS5, "45.56.219.55", 52759)
    socket.socket = socks.socksocket
    
    url = 'https://www.skiddle.com/festivals/dates.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        print(response.text)
    
    except requests.exceptions.HTTPError as errh:
        print("Http Error:", errh)
    except requests.exceptions.ConnectionError as errc:
        print("Connecting Error:", errc)
    except requests.exceptions.Timeout as errt:
        print("Timeout Error:", errt)
    except requests.exceptions.RequestException as err:
        print("Other Error", err)

    print(response.text)

    <!DOCTYPE html>
    <!--[if lt IE 7]><html class='ie ie6 lte9 lte8 lte7 no-js'> <![endif]-->
    <!--[if IE 7]><html class='ie ie7 lte9 lte8 lte7 no-js'> <![endif]-->
    <!--[if IE 8]><html class='ie ie8 lte9 lte8 no-js'> <![endif]-->
    <!--[if IE 9]><html class='ie ie9 lte9 no-js'> <![endif]-->
    <!--[if gt IE 9]><html class='ie no-js'><![endif]-->
    <!--[if !IE]><!--> <html class='no-ie no-js' lang='en'><!--<![endif]-->
    
    <head><!-- Basic Page Needs
    ================================================== -->
    <title>A-Z of Future Festivals</title>
    <link rel="manifest" href="/manifest.json">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!-- DNS Prefetching
    ================================================== -->
    
    
    
    
    <link rel="preconnect" href="https://d31fr2pwly4c4s.cloudfront.net"/>
    <link rel="preconnect" href="https://d1plawd8huk6hh.cloudfront.net"/>
    <link rel="preconnect" href="https://www.google-analytics.com" />
    
    
    <link rel="preload" href="https://d1plawd8huk6hh.cloudfront.net/css-responsive2/fonts/BuenosAires/BuenosAiresWeb1-Regular_gdi.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    <link rel="preload" href="https://d1plawd8huk6hh.cloudfront.net/css-responsive2/fonts/BuenosAires/BuenosAiresWeb1-Bold_gdi.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    
    
    <link rel="dns-prefetch" href="https://d31fr2pwly4c4s.cloudfront.net"/>
    <link rel="dns-prefetch" href="https://d1plawd8huk6hh.cloudfront.net"/>
    <link rel="dns-prefetch" href="https://www.google-analytics.com" />
    <link rel="dns-prefetch" href="//connect.facebook.net" />
    <link rel="dns-prefetch" href="//www.googleadservices.com" />
    <link rel="dns-prefetch" href="//www.stay22.com" />
    <link rel="dns-prefetch" href="//api.stay22.com" />
    <link rel="dns-prefetch" href="//skiddle.imgix.net" />
    <link rel="dns-prefetch" href="//skiddleartists.imgix.net" />
    
    <!-- CSS
    ================================================== -->
    
    <meta property="fb:app_id" content="102483650494"/>
    <meta http-equiv="x-dns-prefetch-control" content="on"/>
    <meta name="insight-app-sec-validation" content="5574b896-289f-48c0-aebb-98730b831151">
    
    <!-- Mobile Specific Metas
    ================================================== -->
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    ...

    Ответ написан
  • Как прокрутить таблицу на странице, которая сама не скроллится?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вам необходимо скролить не страницу, а элемент. Вот мой пример, как скролить определенный элемент: Как проскролить в определенной облачи экран в selenium?
    Ответ написан
  • Fake useragent Error verify?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    got an unexpected keyword argument 'verify_ssl'

    Ну там же на русско-питонячьем написано, что в конструкторе класса FakeUserAgent не поддерживается аргумент verify_ssl.

    https://pypi.org/project/fake-useragent/
    0.1.6 April 2, 2017
    verify_ssl options added, by default it is True (urllib.urlopen ssl context for Python 2.7.9- and 3.4.3- is not supported)
    1.2.0 August 2, 2023
    Parameter use_external_data=True and verify_ssl are removed. If you use those parameters, just remove it in your code!
    Ответ написан
  • Как указать в коде, что заданный индекс выходит за границу всей строки?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    def f(string, index, length):
        return not (length < 0 or index < 0 or index >= len(string) or length + index > len(string))
    
    string = 'Winter is coming'
    
    print(f(string, 4, 4))
    # True
    
    print(f(string, 4, -1))
    # False
    
    print(f(string, -1, 4))
    # False
    
    print(f(string, len(string), 4))
    # False
    
    print(f(string, len(string) - 3, 5))
    # False
    Ответ написан
    6 комментариев
  • Что делает единичная звездочка в аргументах метода Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что делает единичная звездочка в аргументах метода Python?

    namedtuple(
    typename,
    field_names,
    *,
    rename=False,
    defaults=None,
    module=None,
    )

    Ни разу не встречал такое раньше, в документации тоже не смог откопать

    PEP 3102
    Ответ написан
    Комментировать
  • Как спарсить сайт, требующий авторизацию с кодом из смс?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Какие есть способы для решения задачи (желательно из ЯП использовать python)

    Желательно - это "не обязательно".
    Тинькофф сбрасывает любые сессии каждые 12 часов

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

    - Получать смс на временный номер, используя специализированные сервисы с api.
    - Поставить на телефон приложение, которое будет перехватывать определенные смс и слать их указанным образом по указанному адресу, например SMS forwarder или SMS Backup & Restore.
    - Написать свое приложение (если не доверяете чужим), которое сделает все тоже самое, что пункт выше, но здесь будет использоваться не python, а kordova/react-native/flutter/kotlin.
    Ответ написан
    Комментировать
  • Как напечатать слово посимвольно в цикле while в обратном порядке?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    def f(word):
        i = len(word) - 1
        while i >= 0:
            print(word[i])
            i -= 1
    
    f('abcde')
    
    # e
    # d
    # c
    # b
    # a
    Ответ написан
    1 комментарий
  • Как запускать код без остановки?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Это должно работать постоянно и не прерывно, нужен ли для этого сервер и как это сделать?

    - Запускать циклом код, чтобы он выполнял главную функцию раз в X минут.
    - Запускать кроном основной скрипт раз в X минут.
    - Подписаться на событие и выполнять скрипт при наступление этого события (сложнее).
    нужен ли для этого сервер

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

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно ли модулем requests скачать файл формируемым после запроса?

    Requests скачивает файлы, которые генерируются в ответ на запрос, а не после него.
    Remote end closed connection without response

    Ошибка скорее связана с сетью или доступом к ресурсу.
    Ответ написан
    Комментировать
  • Как изменить переменную index, чтобы не работал бесконечно?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    def print_numbers(last_number):
        i = last_number
        while i >= 1:
            print(i)
            i -= 1
        print('finished!')
    
    print_numbers(last_number=4)
    
    # 4
    # 3
    # 2
    # 1
    # finished!
    Ответ написан
    1 комментарий