Задать вопрос
  • В чем разница конструкций?

    Vindicar
    @Vindicar
    RTFM!
    async def main():
        print(f"started at {time.strftime('%X')}")
        # вызов займёт 2 секунды, а не 3
        await asyncio.gather(say_after(1, 'hello'), say_after(2, 'world')) 
        print(f"finished at {time.strftime('%X')}")


    В синхронном коде такое можно имитировать только потоками.
    Ответ написан
    Комментировать
  • Как вывести по одному разу каждый символ который есть в строке?

    Vindicar
    @Vindicar
    RTFM!
    print(set(my_str))
    Ответ написан
    Комментировать
  • Расширение таблицы при парсинге?

    Vindicar
    @Vindicar
    RTFM!
    Если куски подгружаются динамически с помощью AJAX, то у тебя два выхода.
    а) выяснить, какой запрос нужно отправить на сервер, чтобы получить кусок таблицы, и выполнять именно этот запрос
    б) гонять полноценный браузер с помощью селениума
    Ответ написан
    Комментировать
  • Выдает ошибку list indices must be integers or slices, not str на 13 строке, в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    Ты очевидно что-то напутал со структурой данных res - на каком-то из уровней в ней список, а ты ожидаешь словарь с ключами-строками. Выведи эту структуру с помощью pprint, разберись, чем она отличается от твоих ожиданий, и поправь код обращения к res.
    Ответ написан
    Комментировать
  • Как записать в файл данные в заданном порядке?

    Vindicar
    @Vindicar
    RTFM!
    for m, k, z in zip(all_post, all_comments, all_undercom):
    Зачем тебе этот цикл, если ты ниже делаешь
    for k in all_comments:
    for z in all_undercom:

    У меня такое чувство, что ты не очень понимаешь, что делает функция zip.
    Ответ написан
    1 комментарий
  • Как вызвать self класса родителя?

    Vindicar
    @Vindicar
    RTFM!
    Неправильная терминология. Example - не родитель MyThread.
    Передайте ссылку на экземпляр Example (или на нужное поле) через параметр конструктора MyThread и сохраните её как экземплярную переменную класса MyThread. Но имейте ввиду - не факт, что вы сможете обратиться к элементам управления QT непосредственно из другого потока.
    Ответ написан
  • Что делать если телеграмбот который показывает погоду вылетает после неправильного введённого города?

    Vindicar
    @Vindicar
    RTFM!
    Скорее всего при неправильном городе вызов
    observation = mgr.weather_at_place(message.text)
    сгенерирует исключение. Судя по докам, это будет либо ParseResponseException либо APICallException. Если бы ты озаботился привести полное сообщение об ошибке, можно было бы сказать точно.
    В любом случае, читай про обработку исключений. Тебе нужно завернуть вызов в блок try, и если возникла ошибка - сообщить пользователю.

    Это я понимаю. Я не сам писал бота это ролик из ютуба.

    Если понимаешь, учи основы питона по-старинке - учебник и упражнения. По ютубу научишься только повторять, не понимая смысла. Сначала - основы, потом уже бросайся писать ботов.
    Ответ написан
    Комментировать
  • Как сделать Авторизацию Вконтакте и открыть в браузре страницу?

    Vindicar
    @Vindicar
    RTFM!
    Если парсить, тебе придётся имитировать поведение пользователя. Тут будет проще использовать что-то типа Selenium.
    А вообще, почитай доки на API. Если они позволяют решить твою задачу, то используй их, это будет надёжнее.
    Ответ написан
    Комментировать
  • Как постоянно обновлять принт?

    Vindicar
    @Vindicar
    RTFM!
    Тут все предлагают system("cls"), хотя практичнее было бы использовать символ \x08.
    Простой пример, для понимания:
    print('foobar', flush=True, end='') #немедленный вывод без перевода строки
    print('\x08'*3, flush=True, end='') #отступаем на три символа назад
    print('xyz', flush=True, end='') #на экране будет выведено fooxyz

    Но этот приём работает только если:
    1. Данные выведены строго в одну строку, и курсор остаётся на ней.
    2. Известна длина затираемой части строки.
    3. Обновлять таким образом нужно только одно значение на экране.

    В противном случае либо используешь приём с cls, либо вообще плюёшь на терминал и делаешь GUI.
    Ответ написан
    Комментировать
  • Python/numpy: как увеличить массив на одну строку без использования дополнительной памяти?

    Vindicar
    @Vindicar
    RTFM!
    Нельзя. В этом и состоит отличие массива от списка. Список легче растянуть, чем массив, так как массив хранит все свои данные одним блоком, а список хранит одним блоком только ссылки на свои элементы.
    Нужно либо выделять массив с запасом, либо сбрасывать данные на диск для последующего чтения в numpy-массив.
    Ответ написан
    1 комментарий
  • Селениум. Использую find_elements и get_atribute, а как сделать одним запросом, чтобы без ошибки not attached?

    Vindicar
    @Vindicar
    RTFM!
    Насчёт not-attached - я подозреваю, ты не дождался, пока страница полностью прогрузится.
    А вообще в XPath есть выбор значения атрибута:
    //ul[@id="im_dialogs"]/li[contains(@class, "nim-dialog_unread ")]/@data-list-id

    Либо, возможно, так
    string(//ul[@id="im_dialogs"]/li[contains(@class, "nim-dialog_unread ")]/@data-list-id)

    Здесь string() - это не Python-функция, а XPath-функция. Если селениум её поддерживает, то запрос должен вернуть именно строковое значение атрибута.
    Ответ написан
  • Почему не выдаёт каждый раз новое прокси?

    Vindicar
    @Vindicar
    RTFM!
    Какая лютая жесть. Нахрена все эти преобразования из списка в строку и обратно?
    Я предполагаю, что в файле одна строка - это один прокси, и файл не настолько чудовищно велик, чтобы избегать его полной загрузки в память. Тогда если на пальцах:
    1. Описываешь функцию, которая разбирает строку в описание прокси (например, в кортеж "адрес,порт"). Например, если прокси указаны в виде адрес:порт, то подойдёт что-то типа
    @staticmethod
    def parse_proxy_line(line):
        # сработает, если на каждой строке указан порт
        addr, _, port = line.strip().rpartition(':')
        return (addr, int(port))

    2. В конструктор передаёшь коллекцию строк с прокси. Можно сделать что-то типа
    def __init__(self, source):
      self.proxies = list(map(parse_proxy_line, source))

    Учитывая, что текстовый файл - это тоже коллекция строк, можно просто передать открытый файл.
    with open('whatever.txt', 'rt') as src:
      proxy_list = ProxyList(src)

    После этого с файлом не работаешь - незачем.
    3. Создаёшь поле класса, в котором хранишь индекс следующего прокси для выдачи. Можно обойтись без этого индекса, если список не будет использоваться повторно - тогда можно просто отдавать нулевой элемент списка, и сразу же удалять его.
    4. Пишешь метод, который по запросу берёт элемент списка с указанным индексом, затем увеличивает индекс. Это повторяется, пока не найдётся рабочий прокси или пока индекс не выйдет за пределы списка.

    Всё! Кода на 15 строчек (с учётом проверки).

    А вообще можно обойтись и без класса.
    from typing import Tuple
    def parse_proxy_line(line: str) -> Tuple[str, int]:
        # сработает, если на каждой строке указан порт
        addr, _, port = line.strip().rpartition(':')
        return (addr, int(port))
    def is_good_proxy(proxy: Tuple[str, int]) -> bool:
        host, port = proxy
        return ... #тут проверяешь, хороший ли прокси и возвращаешь True если да
    
    src = open('proxies.txt', 'rt')
    # Это - ленивое вычисление. Когда мы запросим следующий прокси, 
    # filter() будет запрашивать элементы, пока не найдёт "хороший",
    # т.е. такой, для которого is_good_proxy() вернуло True
    # В свою очередь, эти элементы будут запрашиваться из map(), 
    # которая будет брать элементы из src и вызывать для каждого parse_proxy_line()
    # А элементы в файле src - это текстовые строки, которые будут читаться по запросу.
    # Таким образом, нет необходимости хранить весь список прокси в памяти, 
    # они будут подгружаться по мере возникновения потребности.
    proxies = iter(filter(is_good_proxy, map(parse_proxy_line, src)))
    
    #когда нужно получить ещё один прокси:
    host, port = next(proxies) #next - встроенная функция
    #если прокси закончились, выкинет исключение StopIteration, которое можешь поймать и обработать как хочешь.
    Ответ написан
    8 комментариев
  • Как в python увидеть текст диалогового окна сторонней программы?

    Vindicar
    @Vindicar
    RTFM!
    Смотря чем ты автоматизируешь. pywinauto позволяет обращаться к диалоговым окнам, тогда тебе потребуется только найти внутри текст - скорее всего, это будет контрол типа "Static".
    Ответ написан
    1 комментарий
  • Что это за странный элемент в коде сайта?

    Vindicar
    @Vindicar
    RTFM!
    Быстрый гуглинг по "Opera CSS :root" нашел утверждения, что это дело рук Оперовского встроенного адблокера. Попробуй его отключить.
    Ответ написан
    1 комментарий
  • Как правильно настроить многопоточность у бота telegram?

    Vindicar
    @Vindicar
    RTFM!
    Если коротко: пусть бот работает в главном потоке. ФЗ, синхронно или асинхронно, зависит от используемой библиотеки. Судя по приведённому коду, синхронно.
    А вот все длительные операции запускайте в отдельных потоках или даже процессах.
    Для общения между потоком бота и рабочими потоками/процессами организуйте две очереди. Из одной потоки обработки данных будут принимать задания. В другую они будут складывать сообщения для отправки (текст + id пользователя, например). Тогда основной бот должен по готовности запроса положить объект с описанием задания в первую очередь, а также периодически проверять наличие сообщений во второй. При наличии - извлекать и отправлять по назначению.
    Ответ написан
  • Написал на основе pydirectinput и pyqt5 простой антиафк, при нажатии кнопки запуск приложение вылетает, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Приложение просто не отвечает после нажатия кнопки 'Запуск'(функция start)

    Ну а что, логично. Читай как устроены оконные приложения, это же азы рабоыт с любым GUI.
    Если кратко, у них в основе цикл, который принимает сообщения от ОС (нажата клавиша, сдвинута мышь, и т.д.) и обрабатывает их.
    PyQT реализует этот цикл сам, ты имеешь дело только с обработчиками событий - но цикл от этого никуда не девается. Всё происходит в одном потоке, так что пока обработчик события работает - цикл стоит, следующие сообщения ждут очереди.
    Так что когда ты делаешь while self.gag==True:, твой обработчик никогда не выйдет из цикла while, никогда не передаст управление оконному циклу, и щелчок по кнопке end никогда не будет обработан (кк и любое другое событие).

    Что делать?
    а) start запускает второй поток, end его останавливает. Кури документацию к модулю threading.
    б) смотри, есть ли в PyQt способ запланировать вызов функции на следующей итерации оконного цикла/спустя некоторое время. В этом случае ты можешь раз за разом планировать вызов своей функции, которая реализует одну итерацию (гапример, шлёт одно нажатие кнопки). Поскольку её вызов будет выполняться средствами оконного цикла, а отрабатывать она будет быстро, это не помешает оконному циклу.
    Ответ написан
    1 комментарий
  • Как сдлать автоматическую отправку сообщений самим ботом в дискорде на C#?

    Vindicar
    @Vindicar
    RTFM!
    Я так понимаю, библиотека для работы с дискордом имеется?
    Там наверняка предусмотрен механизм реакции на события.
    Ищи в её документации либо событие "добавление на сервер", либо событие "соединение установлено", смотря что ты подразумеваешь под входом на сервер.
    Потом уже дописывай обработчик для нужного события, и в нём делай что требуется.
    Ответ написан
    2 комментария
  • Как автоматически активировать мышку при запуске Windows?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону pywinauto. Он имитирует клики мышью по-другому, по идее должно работать.
    Ответ написан
  • Почему то ошибки в консоле нету, но и сообщение (123), не отправляться (aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    test = False
    Ниже
    if test == True:
    async def prdfg(message: types.Message):
    У тебя prdfg не будет объявлено, так как на момент выполнения этой строки test всё ещё False.
    Ответ написан