• Как отслеживать прогрузку элементов на сайте в selenium?

    MinTnt
    @MinTnt
    Как пример
    from selenium.webdriver.support.wait import WebDriverWait
    
    WebDriverWait(driver, 300).until(lambda x: x.find_element_by_css_selector('.test'))
    Ответ написан
    Комментировать
  • Как "перепрошить" мозг будущему программисту?

    MinTnt
    @MinTnt
    Скажу так, я к примеру работал тестером(QA) различных проектов, и за это время я понял одно, кому-то даётся, а кому-то хуже. К примеру я мог проанализировать системы, и вывести возможные проблемы и предложения решения.

    Так что даже если правильно построить алгоритм решения не выходит, можно просто сначала найти кого-то (забыл как их человек называют), кто мог бы пошагово объяснить/предложить как минимум два-три предложения для реализации задачи. Обычно, просто начинаешь улавливать логику каких-то систем. (Хотя, в конечном итоге может и скучно стать, когда слишком должно был в каком-то проекте, и уже понимаешь как устроено абсолюнто(почти) всё. )
    Ответ написан
    Комментировать
  • Как в python telebot изменять ReplyKeyboardMarkup?

    MinTnt
    @MinTnt
    Изменить цвет нельзя. Размер - можно, в Гугле есть ответ.
    Всё остальное делается при помощи bot.edit_message(), в котором передавать изменённую клавиатуру.

    Изменённую клавиатуру можно, лучше и удобнее, пересоздавать - создав специальную функцию для этого.
    Ответ написан
  • В чем ошибка в калькуляторе?

    MinTnt
    @MinTnt
    Причина ошибка - невозможно производить чисельные операции со строками.
    Варянт исправления, добавление проверки, являются ли введёные данные числами, для их последующего преобразования
    while True:
    
    	a=input("Введите первое число: ")
    	b=input("Введите второе число: ")
    	if a.isdigit() and b.isdigit():
    		a, b = int(a), int(b)
    
    		c = input("Введите условный знак(*-+/) ")
    		if c == "+":
    			summa=a+b
    			print ("Ответ", summa )
    		elif c == "-":
    			summa=a-b
    			print ("Ответ", summa )
    		elif c == "*":
    			summa=a*b
    			print ("Ответ", summa )
    		elif c == "/":
    			summa=a/b
    			print ("Ответ", summa )
    	else:
    		print('Вы ввели не числа')
    Ответ написан
    2 комментария
  • Игровой бот с БД для бесед в ВК на Python, можете помочь с созданием?

    MinTnt
    @MinTnt
    Так как проверка каждые 15 сек баланса, и само постоянное прибавление баланса абсолютно всем пользователям будет очень сильно нагружать. Лучше сделать так: в БД добавить параметр последней проверки баланса. time.time(), а далее, когда пользователь снова вводит команду баланса, ему в БД устанавливается в этот момент значение соответствующее;
    money(Деньги записанные в БД) + (time.time() - int(Время последнего обновления баланса записанное с БД)) // 15
    Таким образом это уменьшит нагрузку, и создаст иллюзию, что деньги прибавляет каждые 15 секунд.

    Минусы - если пользователь будет постоянно делать проверку баланса или тд, ему может и не начислять каждые 15 сек, так как время между запросами будет постоянно обновляться.
    Решение - сохранять в БД лишь то время, когда
    money + (time.time() - int(update_balance_time)) // 15

    Является больше нуля, если же меньше, то не обновлять в БД значение
    Ответ написан
    3 комментария
  • Как получить текст сообщения к которому прикреплена инлайн клавиатура?

    MinTnt
    @MinTnt
    Ну раз callback_query.message.text не показывает, то максимум ещё можно: 1) Хранить отдельно сообщения где-то в базе. 2) При создании inline кнопки, задавать значению callback = значение текста + какой-то разделительный набор символов + остальная важная инфа callback. К примеру callback = "Привет всем/asdgse/StartTime". И потом при считывании можно доставать текст через .split('/asdgse/'), как набора разделительных символов.
    Ответ написан
    3 комментария
  • Как сравнить два значения?

    MinTnt
    @MinTnt
    s=['100000','103213',"123451","1242166"]
    
    for x in range(len(s)-1):
    	if s[x][:2] == s[x+1][:2]:
    		print('a')
    	else:
    		print('b')

    Небольшая инфа:
    1. В изначальном коде была ошибка, которая не сходилась с условием
    сравнить первые 2 цифры
    , а срез выглядел как [2:], что наоборот брало в учёт всё что находится правее включая символ под индексом 2. [:2] - же как раз получает первые два символа под индексами 0, 1 но не включая индекс 2
    2. Почему именно такой цикл?
    for x in range(len(s)-1):

    Сам по себе x в этом цикле отыгрывает роль индекса для списка.
    len(s)-1 - используеться для того, чтобы брались все индексы, кроме последнего, так как если бы включить и последний, то вылезит ошибка при попытке получить это значение s[x+1]
    Ответ написан
  • Не могу спарсить элементы страницы с непонятными классами почему?

    MinTnt
    @MinTnt
    Вообще, парсинг бывает не всегда так прост как кажется. Сайты часто пытаются различными способами даже минимальными, защищаться от простых парсеров, при этом есть ещё и различные разновидности защит.

    А вообще, если ты хочешь посмотреть что же получаем из пост запрос, просто делай запись в файл, так будет проще понять где ошибка и тд. К примеру
    import requests
    
    getpost = requests.get('https://www.parimatch.ru/')
    with open('log.html', 'w', encoding='utf-8') as f:
    	f.write(getpost.text)

    Далее сможем открыть эту страничку, и посмотреть что нам загрузило.

    В основном как мы видим, есть лишь пустая старничка с заставкой. Значит инфа вся подгружается скриптом.

    Ещё раз повторюсь, что не всё так просто, но за то весело устроено. :D

    Я вот пока посмотрел, матчи сначала подружаются get запросом по адресу https://www.parimatch.ru/api/top-matches в формате:
    spoiler
    "abTestLabel":null,"topEvents":[{"id":"F","eventList":["1|6154167","1|6154172","1|6154171","1|6154169","1|6153670","1|6154164","1|6154166","1|6154165","1|6154170","1|6154168"]},{"id":"CS","eventList":["1|6193860","1|6173617","1|6193859","1|6161642","2|6192368","1|6193855","1|6193858","2|6191488","2|6192369","2|6191486"]},{"id":"H","eventList":["1|6185855","1|6185856","1|6174639","1|6174637","1|6174635","1|6174636","1|6190210","1|6174680","1|6174948","1|6179742"]},{"id":"B","eventList":["1|6173785","1|6173786","1|6173784","1|6173976","1|6174103","1|6173789","1|6173929","1|6166406","1|6166663","2|6188578"]},{"id":"T","eventList":["1|6189125","1|6192182","1|6191996","1|6190277","1|6190232","1|6189853","1|6192338","1|6192328","2|6186610","1|6191995"]},{"id":"TT","eventList":["2|6193585","2|6192227","2|6193586","2|6193234","2|6193462","2|6193912","2|6192904","1|6193575","1|6193624","1|6193623"]},{"id":"VB","eventList":["2|6187527","1|6187528","1|6191657","1|6187530","1|6186281","1|6177549","1|6186390","1|6186283","1|6186388","1|6186284"]}],"source":"TopMatch"}

    С которого по этим данным отправляется запрос в БД на получение данных по адресу
    https://www.parimatch.ru/content/strapi/system/graphql?

    query: "query getData($id: [String]) {events(where: {id: $id}) { slug, id, sportCode, categoryId, tournamentId }}" В котором в параметрах даты передаются ID матчей что получены с первого запроса "variables":{"id":["6173617","6154171","6154169".

    Надеюсь помог. :g
    Ответ написан
    4 комментария
  • Как отобразить переменную на картинке Python?

    MinTnt
    @MinTnt
    Не очень вопрос понял, но кажется вы имеете ввиду библиотеку PIL.
    Ответ написан
    Комментировать
  • Мне надо из списка удалить последние символы 1 части списка, как это сделать?

    MinTnt
    @MinTnt
    Довольно просто при помощи срезов и генератора
    d=["dsadadasda"]
    
    d=[x[:-3] for x in d]
    print(d)
    Ответ написан
  • Почему при пост запросе данные через Fiddler, и через requests отличаются?

    MinTnt
    @MinTnt Автор вопроса
    Проблему решил давно, решил здесь отписать. Всё было довольно очевидно, я тогда просто не заметил что в запросе происходила переадресация. По этому когда заметил, просто через post.history прочитал последующие запросы, и достал нужные мне куки-сессии из headers.
    Ответ написан
    Комментировать
  • Как удалить теги html в python с помощью регулярных выражений?

    MinTnt
    @MinTnt
    Ну как варянт:
    import re
    text = '...' #Тут какой-то текст html
    
    print(re.sub('(</?\w+/?>|<\w+\s[\w\W]+?>)', '', re.findall('(<body>|<body\s.+>)?([\w\W]+)(</body>)?', text)[0][1]))
    Ответ написан
    Комментировать
  • Почему не работает?

    MinTnt
    @MinTnt
    Условия проверки неправильно поставлены
    if time_month == 9 or 10 or 11: можно сказать проверяет значение bool каждого элемента на соответствие True.
    Т.е. это можно записать как:
    if bool(time_month == 9) or bool(10) or bool(11):
    А так как число, если оно не равняется 0, имеет значение bool автоматически True, имеем:
    if bool(time_month == 9) or True or True:
    Т.е., каждое из 4рёх общих условий выполняется всегда и в цикле

    Лучше уже записывать так
    if time_month in [9, 10, 11]:

    Update: мне на мысль сошла идея запихнуть весь код выше в однострочный код. И что же я скажу.. мне это удалось) Для питонистов код ниже прочитать наверное адом будет.
    import datetime
    import time
    import ctypes
    
    while True: [[[[[[[ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['night'], 0) if time_now >= 17 or time_now <= 7 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['obed'], 0) if 12 <= time_now <= 13 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['morning'], 0) if 8 <= time_now <= 9 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['evening'], 0) if 14 <= time_now <= 16 else []] if time_month in [1,2,12] else [ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['night'], 0)  if time_now >= 21 or time_now <= 5 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['obed'], 0) if 12 <= time_now <= 17 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['morning'], 0) if 6 <= time_now <= 12 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['evening'], 0) if 18 <= time_now <= 20 else []] if time_month in [3, 4, 5] else [ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['night'], 0)  if time_now >= 21 or time_now <= 4 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['obed'], 0) if 13 <= time_now <= 17 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['morning'], 0) if 5 <= time_now <= 12 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['evening'], 0) if 18 <= time_now <= 20 else []] if time_month in [6, 7, 8] else [ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['night'], 0)  if time_now >= 17 or time_now <= 6 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['obed'], 0) if 11 <= time_now <= 13 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['morning'], 0) if 7 <= time_now <= 10 else ctypes.windll.user32.SystemParametersInfoW(20, 0, wallpaper['evening'], 0) if 14 <= time_now <= 16 else []] if time_month in [9, 10, 11] else [], time.sleep(1800)] for time_month in [datetime.datetime.now().month]] for time_now in [datetime.datetime.now().hour]] for wallpaper in [{'night': wallpaper_place+'night.jpg', 'obed': wallpaper_place+'obed.jpg', 'morning': wallpaper_place+'morning.jpg', 'evening': wallpaper_place+'late_evening.jpg'}]]] for wallpaper_place in ['C:\\Users\\andriy\\Desktop\\wallpaper\\']]
    Ответ написан
    8 комментариев
  • Sorted Object в Python. Миф или реальность?

    MinTnt
    @MinTnt
    А точно именно sorted? Просто раз вы наткнулись с другом случайно, значит не перебирали специально старые версии Python. Может вы использовали другой метод, к примеру - sort?
    print([].sort)
    
    '''
    Output: <built-in method sort of list object at 0x....>
    Ответ написан
    Комментировать
  • Как получить нужное значение?

    MinTnt
    @MinTnt
    import re
    
    print(re.findall(r"(host|port)='([\d\.]+)'", str(proxy)))

    Возвращает список с кортежами с искомыми данными.
    Далее можно к нему применить как пример - dict(re.findall...), и потом считывать получаемые данные как у словаря.
    Ответ написан
    Комментировать
  • Как отправить json в POST запросе?

    MinTnt
    @MinTnt
    Попробуй не,
    json = data
    а просто,
    data = data

    Если всё равно не получается, то в headers там вроде какой-то уточняющий тип получаемых данных параметр должен быть, по типу "Content-Type" = "application / json"
    Ответ написан
    Комментировать
  • Как из тела письма достать ссылку?

    MinTnt
    @MinTnt
    Скорее всего "тело письма" это обычный текст. А для поиска чего-то в тексте, сойдут и регулярные выражения, к примеру:
    import re
    
    text = '''
    Какое-то письмо, текст тудуду https://store.steampowered.com/account/newaccountverification?stoken=b30ea71dd9a9378cf2737705d4647ed5ef263bc3966ccc4a95fb1b17b5d3b07ca2d9badaae04633ed7e94c95bc8001ad&creationid=3715246062383371817
    ещё какой-то текст, тададу...
    '''
    print(re.findall(r'https://store.steampowered.com/account/newaccountverification?.+\b', text))


    P.s. тут главное правильно сделать шаблон для поиска. А то я чутка не уверен в том что выше.
    Ответ написан
    2 комментария
  • Как можно улучшить код?

    MinTnt
    @MinTnt
    Пришла такая ещё идейка реализации через генераторы:
    start = 1
    end = 11
    row = 10
    
    [[print(i[rw:rw+row]) for rw in range(0, len(i), row)] for i in [[x for x in range(start, end + 1)]]]
    Ответ написан
    3 комментария
  • Что нужно изучить, чтобы автоматизировать получение выписки из банка?

    MinTnt
    @MinTnt
    Если у банка нету своего API, то описанные выше действия напоминают Selenium, где уже сам браузер будет всё сам кликать, но время это всё равно занимает.

    Ну а если через requests. То от логинизации мы обычно получаем какой-то важный токен, который генерируется на определенное время. И после используется для отправки следующих пост запросов на получение информации. А получив нужную инфу, берём сгенерированную ссылку, по которой находится файл для скачивания
    Ответ написан
    Комментировать
  • Как записать информацию переменной STRING в текстовый файл?

    MinTnt
    @MinTnt
    with open(file, 'w') as f:
        f.write(string)
        f.close()
    Ответ написан
    Комментировать