Snusmumriken
mva
или, например, взять html-страницу, выгрепать оттуда ссылки на картинки, цену товара, метаданные товара и т.п. и сформировать из этого csv ;)
Dika
mva
я, вот, на awk это легко делал :)
mva
это регулярками можно
мало IDE умеют регулярки на нормальном уровне (чтоб можно было делать мультистрочную замену (и ещё реже они умеют вставлять несколько строк)
Snusmumriken
mva
Snusmumriken
mva
Dika
mva
Это и сгрепать можно.
https://gist.github.com/raw/64dd949f342bef2ef363fa4d129f83f9 вот как это было у меня
mva
грепом это можно было бы упороться делать :)
mva
кстати, где-то как раз после этого я взялся допиливать Lua-cURL и lua-htmlparser 😁
bebebe
а таких сайтов все меньше и меньше.
mva
увы, но да
Snusmumriken
А там проще. Конвертер однотипных js в csv. Это не сложно.
Snusmumriken
Плюс зачастую изнутри ЯП проще работать с апишкой, чем с сайтом, я пробовал и то и то. Сайты регулярками расковыривать не понравилось : )
Snusmumriken
Ну, у меня были варианты когда вместо запроса прилетает требование капчи, а по урлу капчи прилетает очень сильно обфусцированный javascript, который магическим образом меняет DOM и подставляет куда надо ссылку на капчу, сгенерированную из него самого.
bebebe
я писал о другом случае, когда на javascript'e написана бизнес-логика
Snusmumriken
А тут - на жаваскрипте написана ссылка до капчи ))
bebebe
все таки причем тут капча?
Snusmumriken
Дык там надо было дёргать сторонние сервисы автоматизированно. А сервисы защищаются от роботов.
bebebe
ладно. я вам про данные говорю, а вы мне про капчу.
Snusmumriken
А если на жаваскрипте написана бизнес-логика, то это как раз "простой" случай.
Берём v8, цепляем к луа через ffi и дёргаем. Можно закешировать, для пущей скорости обработки кучи запросов.
А капча этим не разгадалась, потому что отдельный v8 не имеет доступа к DOM'у ))
mva
foma_erema.ogg
bebebe
Snusmumriken
Эмулируем методы.
Пишем библиотеку с функциями, эмулирующими доступ к DOM и прочей JS-апишке, подключаем к v8 по умолчанию ))
Snusmumriken
Это же всё - просто набор функций ))
Их много и они стрёмные, но эмуляция!
bebebe
понятно, вы все таки погуглите что такое selenium-headless
bebebe
а то и впрямь будете v8 дергать из lua
Snusmumriken
Я знаю что такое headless chrome, это не тот вариант. Уже дёргал и в виде селениума и в виде безголового хромчика.
Жручий, делает кучу бессмысленной работы, гораздо медленнее чем голый v8 + эмуляция (раз в двести, это много, в моём случае) ))
bebebe
у вас видимо времени много 😉
bebebe
общий подход такой, в публичных облаках поднимаются контейнеры в headless браузерами, и с одного хоста идет оркестрация
Snusmumriken
У меня мало времени на обработку запрос-ответов сторонних сервисов, там лимиты по секундам на обработку сразу сотни внешних сервисов параллельно : )
bebebe
извините, я тогда сольюсь, вроде про одно говорили, а теперь у нас тут уже json роутер между сервисами в секунду между запросом-и-ответом
Snusmumriken
Чего-чего?
Ты спросил: "[что мы делаем когда] из api приезжает dataset, и далее javascript'ом ".
Я ответил, что конкретно мы делаем, в каких случаях, и объяснил почему. И рассказал, почему не подходит безголовый режим.
bebebe
👌
Snusmumriken
И чего "я тогда сольюсь бла-бла говорили одно бла-бла а теперь совсем другое бла"? К чему это вообще было?
bebebe
я понял что глубоко не прав в нашей беседе и не могу вместить в свой разум всё богатство вашего опыта
Snusmumriken
Snusmumriken
Кстати, восхитительный headless chrome можно дёргать обычным os.execute, а потом парсить то что он выдал в конечном результате. Не такой глубокий контроль как у селениума (там драйвер имеет собственный набор методов типа "жмакнуть кнопку/отправить формочку"), но подобные штуки делаются той же командной строкой но чутка через задницу. Правда, это должен быть таки не хром, а особый девелоперский хромиум, чтобы тянуть такие фичи. Эх.
Ну, я к тому что лишнее звено можно удалить, если не нужен "особый комфорт".
Snusmumriken
А, не, только что проверил - можно и в обычном хроме : )
Yuriy
> os.execute
Мне кажется в коде эта последовательность символов должна применяться крайне осторожно и желательно никогда
Snusmumriken
Хмм. А если тебе надо подписать документ через crypto-pro, у которого только интерфейс командной строки, что ты будешь делать?
Yuriy
Snusmumriken
Snusmumriken
Snusmumriken
Если остро понадобится прям таки безголовый хром - придётся дёргать как миленьким именно через os.execute. Сначала - на тестовой среде, конечно, и с кучей проверок, что туда пихают именно то что нужно, а не sudo rm -rf : )
vitaly
mva
кстати
Alxius
подскажите кто нибудь что сделать чтобы в Sublime 3 pfhf, заработали горячие клавиши на РУССКОМ языке... после какого то обновления в Минт 18с 64 просто они тупо теперь не работают месяца примерно 3-4 назад. в свежеустановленной системе конечно всё ок. но мне не нужна свевжеустановленная мне нужно просто исправить баг . менять ничего не собираюсь. сейчас потихоньку привыкаю писать все транслитом в коде программы в комментариях вместо русского языка.
vvzvlad
Я.
и я. первый(не считая чего-то в школе) и основной(еще си, но его меньше гораздо, и в основном для мк)
Andrei
Не первый, но основной последние 6 лет))
vvzvlad
У меня есть пользовательский код, который я запускаю вот таким способом:
drivers_script_bodies[uuid] = setmetatable({}, {__index=_G})
local status, err_msg = pcall(setfenv(current_func, drivers_script_bodies[uuid]))
Как мне создать функцию, допустим, log(), которая бы была уникальной для каждого скрипта?
vvzvlad
Я хочу сделать так, чтобы каждый скрипт передавал в print свой uuid, но чтобы изнутри скрипта это выглядело бы просто как log("message"). Т.е.
function log(message)
print(uuid, message)
end
ShadoWalkeR
Господа, а как редису сказать сделать чтото на EXPIRE KEY? Пока что из документации выявлено, что он молча удаляет ключ
Yuriy
у него есть pub на все keys
Но это имхо не самый удобный механизм
Yuriy
https://redis.io/topics/notifications
Snusmumriken
ShadoWalkeR
Да мне достаточно уведомления - а на него во внешнем скрипте я сам все прикручу
Snusmumriken
Ммм. Может тогда тебе написать простенький планировщик, который имеет пул событий (хоть в той же редиске) и сам выполняет определённые процедуры по таймеру, включая удаление ключей (вместо expire)?
ShadoWalkeR
Ну я хочу stateless обработчик)
Snusmumriken
ХМММ. Надо глянуть что в мониторинге.
Yuriy
Yuriy
к тому же еще и блокирующий скорее всего
Snusmumriken
> ели есть механизм
Какой механизм?
Yuriy
просто это не всегда удобно
Snusmumriken
Хмммм.
ShadoWalkeR
У меня просто микросервисная система получилась. Осталось решить 2 задачи чтобы совсем по учебнику вышло - что микросервисы полностью stateless стали и "забытые" данные подчищались
Snusmumriken
А всем "забытым данным" выставлять одинаковые expire - не?
Чтобы удалялись одновременно.
Yuriy
Yuriy
да и в других решениях я по событию проверяю если мне сильно надо
ShadoWalkeR
У меня списки и хэши в редисе - мне нужно определенные записи из них дропать
Yuriy
так же у редиса есть поерация добавления только если ключ не существует
Yuriy
забл как ее имя
Yuriy
SETNX