• Как отправлять много запросов get (python) чтобы не забанили на сайте?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы даже не написали о каком сайте речь.
    Банить могут не за частоту, а по совокупности факторов.
    У такого бана всегда есть свои цели. К примеру, метрики показывают владельцам сайта, что существенную часть нагрузки создают вот такие автоматические запросы. Как именно владельцы сайта будут стараться отличить автоматические запросы от человеческих зависит от изобретательности разработчиков.
    Ещё одной причиной, почему владельцы сайта могут стремиться блокировать автоматические запросы - это нежелание делиться данными, публикуемыми на сайте с конкурентами или нахлебниками.

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

    Но такой изощренный подход долог, дорог и не эффективен. Возможно против тех единиц, у котороых достанет денег и упорства так грабить ваш сайт и не стоит бороться. Игра не будет стоить свеч.

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

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

    Если защита на сайте сложнее, то и бороться с нею будет сложнее.

    Нет протого ответа на ваш вопрос, тем более такой наивно абстрактный.
    Ответ написан
    Комментировать
  • Почему не работает переменная которая прошла через функцию?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    И не должно. начните, действительно с учебника, а не сгугла, потому что это основы и самая база. Если вы это не прочитали в учебнике, то вам в питоне больше елать нечего. Просто займитесь чем-то другим. Нагуглить это вы не сможете.
    Это как спрашивать как на калькуляторе установить рингтон.
    Ответ написан
    Комментировать
  • Как отслеживать изменение даты файла с сайта?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Рекомендую сделать скрипт, который будет получать со странички нужные даты и сравнивать с теми, что сохранены в локальном файле, например текстовом, или json, или, даже, csv.
    Если дата соответствующего файла изменилась, скрипт качает новое расписание сохраняет новые даты в файл./
    Если не изменилась - делать ничего не надо.
    Этот скрипт можно запускать с любой нужной частотой, например, с помощью cron или любого другого системного планировщика.
    Ответ написан
    Комментировать
  • Django - Как оптимизировать группировку, чтобы было быстрее?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Попробуйте добавить индекс на пару полей (plu, sku). При выборке сортируйте по ним на упровне БД.
    Используйте itertools.groupby для группировки сперва по plu, а потом и по sku.
    Обходите группировки двумя циклами (один вложен в другой).
    Внутри внутреннего цикла уже можно использовать литерал генератора списка, чтобы получить список pack_type_id.
    Это позволит сразу собирать последовательно элементы словарей и не возвращаться к уже собранным.
    Если вашу структуру нужно поместить в какой-то внешний json-файл или отдавать в тело http-запроса в json-формате, то можно попробовать писать json с помощью какой-нибудь потоковой библиотеки вроде этой: https://pypi.org/project/jsonstreams/
    Это позволит не ждать по отдельности извлечение данных из БД, сборку структуры а пвмяти, а затем сериализацию ее в файл или в поток сокета. Всё будет делаться в рамках одного конвейера, что может оказаться более эффективным по времени.

    Однако вам и ваш способ стоило бы проверить на предмет "бутылочных горлышек" и понять что именно занимает у вас основное время работы вашего алгоритма.
    Возможно радикально ускорить процедуру и не удастся ввиду очень медленной БД или гиганского размера получающейся структуры.

    Расскажите подробнее куда вам нужна такая структура, какой у нее получается объём, куда вы её потом пихаете, как измеряете скорость, почему вам так критична эта скорость?
    Может быть проблема решается и иначе? К примеру, может оказаться, что вам не требуется синхронно возвращать всю структуру, или можно запрос и ответ развести в отдельные запросы, сделав интерфейс более отзывчивым.

    В общем опишите вашу задачу подробнее. Ну и есл что наисал не понятно, спрашивайте. Буду разьяснять детальнее.
    Ответ написан
    Комментировать
  • Какая физика нужна разработчику игр?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Щкольная физика нужна для ориентировочного понимания того, как устроен и работает наш мир.
    Когда вы будете разработчиком, то столкнётесь с очень разными задачами, в том числе далеко выходящими за рамки школьной физки. Но школа в целом и школьная физика в частности нужна в первую очередь не для получения конкретных знаний и заучивания конкретных формул, а для формирования УМЕНИЯ УЧИТЬСЯ, умения осваивать новые концепции, поступательно и планомерно разбираться в теоретических основах, ориентироваться в механике реального мира.

    Постоянно сталкиваюсь с людми, которые не понимают даже во взрослом возрасте простых бытовых вещей вроде закона Ома, что такое ток, напряжение и мощность, не отличают ватты от ватт-часов и ампер-часов.

    Я уверен, что разработчик, а тем более разработчик в геймдеве, обязан лучше других понимать устройство нашего мира, чтобы успешно и эффективно решать работчие задачи. Да, сложные задачи требующие таких знаний встерчаются не каждый день, но если вы плохо понимаете физику, то вы просто не различите таких задач и не найдёте элегантных способов их решения.

    Визика важна.
    Ответ написан
    3 комментария
  • Можно ли вывести заголовки столбцов при поиске командой GREP?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы могли бы использовать питон. С помощью pythonpy это удобно делать однострочником вроде:
    py "csv.DictReader(sys.stdin)" < x.csv
    Но есть два нюанса.
    - Вам нужно сохранить после фильтрации первую строчку (заголовок) csv-файла (например как вам в соседнем ответе предложили).
    - На выходе у вас будут словари, которые очень похожи на josn.

    Все эти нюансы можно легко обойти.
    Во-первых, пропадает смысл использовать grep, раз вы и так юзаете питон. Можно фильтровать прямо им примерно так:

    Во-вторых, после фильтрации можно вернуть первую строку обратно, как в соседнем ответе.

    Второй нюанс фиксится не так элегантно, но вполне понятно:
    py "(', '.join([f'{k}: {v}' for k, v in rec.items()]) for rec in csv.DictReader(sys.stdin))" < x.csv


    Опять же, будьте осторожны с такими самодельными форматами. Нужно помнить о возможно йнеобходимости экранировать данные.
    Ответ написан
    Комментировать
  • Как завершить выполнение первой функции из второй и наоборот?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне код может работать одновременно только в разных процессах. В рамах одного процесса треды не позволяют работать коду одновременно. Скорее всего у вас есть в функции место, где вызывается какой-то sleep или обращение к внешним библиотекам, на время выполнения которых управление переключается.
    Это значит, что вы можете мониторите некое условие в цикле и ставить какой-то глобальный флаг, а значение этого флага отслеживать в цикле в другом треде.
    Для таких целей есть такая структура данных, как семафор.
    Однако, судя по вашему описанию задачи, у вас беда с архитектурой вашего решения. Приведите ваш код более етально и вам тут дудут советы как более правильно обработать ваши события, как более окрректно с архитектурной точки зрения построить ваш код.
    Ответ написан
    1 комментарий
  • Как реализовать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Прочитайте про концепцию "конечного автомата". В вашем автомате будет столько отдельных курсоров, сколько пользователей общается с ботом. Нужно для каждого пользователя хранить отдельный курсор в графе состояний. В зависимости от пользователя выбираем извлекаем нужный курсор и в зависимости от его положения интерпретируем сообщение.
    Цикл отдельный запускать сожиданием ответа для одного польователя - это не правильно.
    Ответ написан
    2 комментария
  • Есть ли нормальная программа для прослушивания аудиокниг?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Пользуюсь Podcast Addict под андроид.
    Удобно слушать подкасты и аудиокниги. Синхронизации между устройствами вроде нет, но и не нужно, ведь можно слушать только со смартфона. Если надо, по блютус к колонке его приконнектить можно, но я книги всегда слушаю через беспроводную гарнитуру. Не вижу ни одной причины делать это с разных устройств. Расскажите о ваших сценариях когда нужна синхронизация?
    В проге можно добавить каталог как подкаст с сортировокой по имени файла. И прога будет воспроизводить файлы по очереди.
    Можно подписываться по rss или через icloud на сетевые подкасты, можно слушать интернет радио и стримы. Поддеживает видео-подкасты.

    Иногда я у себя на VDS скачиваю торрент с книжкой, создаю rss-файл вот этой самописной питоновской утилитой и кидаю в каталог, раздаваемый через nginx. Ссылку на rss кидаю себе в телегу и открываю на смартфоне Podcast Addict'ом. Получаю, как бы, подкаст, но аудиокнигу, которую не обязательно полностью скаичвать еликом на телефон. Если на смартфоне мало места, то это очень удобно. Скачивать можно по мере прослушивания или вовсе слушать в потоковом режиме не скачивая.

    Всё руки не дойдут никак сделать автоматический бот для телеги, который сам будет по магнет-ссылке качать нужный торрент, публиковать как вритуальный подкаст и возвращать ссылку на rss.
    Ответ написан
    Комментировать
  • Почему не работает?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    <button class="btn btn-primary btn-buy" type="sumbit" name="id" value="1">Купить</button>

    Вот так получится.
    Ответ написан
    4 комментария
  • Как из txt файла вытащить строки с одинаковым началом?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Подсказка: отсортировать.
    Ответ написан
  • Как логичнее дописывать название файла из вывода?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ох... сударь, вы творите какую-то дичь!
    Зачем присвивать дескриптор открытого на запись файла в sys.stdout?
    Вы пытаетесь передавать некие данные из скриптов через имя пустого файла в файловой системе?
    Тот ещё изврат, конечно.
    А как вы эти скрипты запускаете? В разнобой в произвольном порядке? Что мешает содержимое трёх скриптов забрать в три отдельные функции, а из их результатов собрать строку, которая послужит именем нового файла? Какой ещё рефакторинг? Да и в чем проблема держать скрипты в отдельных файлах, но импортировать их в одном и в нем же создавать нужный сигнальный файл?
    То, что пытаетесь сделать вы, выглядит как страшный костыль, а по факту костылём и является.

    Почему конкатениря строку вы не пользуетесь форматными строками?
    Вместо нечитаемого:
    "#"+(b)+tail+str(scale)+".txt"
    будет элегантное:
    f"#{b}{tail}{scale}.txt"
    Ответ написан
    Комментировать
  • Когда в проектах оптимально использовать ORM, а когда чистый SQL?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Тут ответ простой. Если вы задаёте такой вопрос, причем именно вот в такой обобщенной формулировке, то вам следует использовать штатный ORM типовым образом.
    Поскольку в вопросе нет никакой конкретики по поводу проблем, которые автор вопроса собирается решать на чистом SQL, можно исходить из предпосылки, что таких проблем нет.
    Как только будут озвучены конкретные проблемы, можно будет говорить и как их решать. К примеру это могут быть вопросы оптимизации или вопросы представления очень специфических структур данных, плохо или нестандартно ложащихся на реляционную модель.
    Если опыта работы с Django ещё мало, то стоит руководствоваться best practices в рамках концепции фреймворка. В таком случае вы найдёте больше простых примеров и документации по любым вопросам.
    Как только вы столкнётесь с настолько специфическими задачами, что они будут плохо решаться стандартными методами, у вас будет уже гораздо больше опыта и этот вопрос отпадёт сам собой.

    ИМХО.
    Ответ написан
    Комментировать
  • Как правильно сделать запрос?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Куки и заголовки нуно указать как в браузере.
    Ответ написан
  • Как оптимизировать вставку данных в таблицу с 2млн строк?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Пока не диагностирована конкретная проблема, нет смысла оптимизировать методом тыка, тем более не видя всей картины.
    Попробуйте логировать тайминги всех запросов на клиентах. По факту каждого выполнения каждого запроса нужно указывать таймштамп старта и длительность.
    Потом сливайте все логи в одну кучу и стройте гистограмму, потом анализируйте что происходит с БД.
    Ответ написан
    Комментировать
  • Код почему то запускаеться 5 раз хотя такого не должно быть в чем может быть проблема?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что вас удивляет? Все работает как написано.
    SQL-запрос вернул 5 записей, вы перебираете их циклом, в котором при первом проходе выполняется некий код с инвентарем, а на остальных четырех проходах i=1 и срабатывает негативная ветка, где печатается символ нуля.
    Судя по тому, как вы неправильно пользуетесь шаблонной строкой и какой вопрос задаете, вы далеки от программирования. Надо подучиться питну и основам алгоритмизации.
    А еще так подставлять параметры в запрос опасно, нужно передавать их отдельно в execute.
    Ответ написан
    1 комментарий
  • Как распазнать черные точки на картинке?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А как вы пытались решить эту задачу? Поисковик выдаёт решение в первой строчке. Вы искали?
    https://www.google.com/search?q=opencv+%D0%BF%D0%B...
    Это не сайт для фриланса, тут отвечают на вопросы и помогают с кодом, если что-то не получается. Если вы и не пытались решать задачу, то вам не сюда.
    Написали бы хотя бы рассуждения.
    Складывается впечатление, что вы не пытаетесь сами научиться решать такие задачи, а хотите чтобы кто-то сделал для вас готовый код.
    Ответ написан
  • Почему удаляются данные из переменной?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Почему после создания словаря(row_sort)..

    В коде нет переменной row_sort. Читайте внимательно.

    .. в переменной row пусто?

    В коде нет переменной row. Читайте внимательно.

    Что вы хотите сделать этой строчкой? print(*rows)
    В перемнную rows кладётся CSV-ридер:
    rows = csv.DictReader(file_in, delimiter=",")
    Это объект-генератор, который выдаёт строки из CSV-файла. Но вы все строки из него достали вот в этой строке кода:
    rows_sort = {i["email"].split("@")[1]: 0 for i in rows}

    Это значит, что этот генератор теперь пуст и при попытке превратить его в кортеж (то есть распаковать звёздочкой в аргументы функции), он возвратит пустой кортеж, ведь генератор останавливает итерацию сразу, файл вычитан полностью.
    Ответ написан
    2 комментария
  • После переименования файлов на Python удаляются файлы, как починить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Они не удаляются, они все по очереди переименовываются в одно и то же имя.
    Значение перемнной now определно один раз перед циклом и не меняется в цикле.
    Вычисляйте новое имя тоже в цикле.
    И да, всё равно это плохая идея так переименовывать.
    Вы зачем-то много раз получаете текущее время для получения каждой компоненты времени.
    Вы не проверяете коллизии там, где они могут быть.
    Ну и да, используйте уже встроенный pathlib, сколько можно шевелить это дерьмо мамонта?
    Ответ написан
    Комментировать
  • Как выбрать последнюю строку в которой было определенное слово?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам бы, сударь, основы алгоритмизации подучить. Так не пойдёт.
    А тем, кто набредёт на вопрос, могу предложить задачу - сделать это односточником.

    Решение тут:
    spoiler

    functools.reduce(lambda a, b: a and b, filter(lambda line: word in line, open('файл.log')))

    Упадёт с ошибкой, если строк со словом в файле нет.
    Ответ написан
    Комментировать