Web Scraper 6: yet another client

В общем, теперь есть ещё один клиент. Замечательно. Его оказалось даже легче интегрировать с основной системой, чем я думал с самого начала. Дольше собирался. 

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

  • wreq
  • phantomjs
  • webdriver
  • servant-client

Нормально насобирал за всё это время. Прикрутить MAS, distributed computations к этому делу, и можно заниматься ботоводством в промышленных масштабах. 

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

Web Scraper 5: performance

Вообще webdriver + selenium в связке очень хорошо себя показывают, но offline и долго. К примеру опрос одного таргета занимает 161 минуту и высасывает 2 ГБ трафика, из которого мне надо лишь 2 МБ (максимум, на самом деле ещё меньше). 

Сие очень опечалило настолько, что поставил приложеньку на смартфон, воткнул mitmproxy и прослушал API, удалось восстановить, но есть нюансы. Например, ограничение на 10 тысяч запросов в день. Мне надо больше. Надо запиливать ещё одного клиента, на сей раз под API. 

Собрал таким образом (через селениум) только два таргета (всего около сотни). Добавил сравнение с предыдущим анализом, ну чтобы не делать лишнюю работу в случае расхождений. Думаю, всё же клиент существенно упростит мне задачу, и я смогу собирать более 1 таргета за ночь, а скажем 2 или 3.

Динамический ввод капчи — отдельная вещь. Осталось лишь пульнуть уведомление на смартфон, чтобы не киснуть возле компа всё время.

Web Scraper 4: chromium server-side

Опробовал затащить всю связку agent + selenium-standalone + chromium-driver + headless chromium на сервер.

  • Тесты поначалу были оптимистичными. Словил капчу.
  • Научился обмениваться User-Agent и кукисами между разными браузерами (chromium и w3m). 
  • Научился распознавать и вводить капчу через w3m.
  • Но не только я учился. Целевой ресурс хорошо стал работать с ботами и browser foot-print-ми.
  • Раз уж «умею» из консоли читать картинки, w3m становится более не нужен. Запиливаю интерактивный режим ввода капчи.
  • GDPR внедряют. Причем вроде скрипт-то простой, который ставит куки и рефрешит страницу, а вешает намертво безголовый хром. Блокер. Потому что с сохранением кук проблем нет вообще. А с загрузкой.. В общем, обойти GDPR заглушку я не могу уже не первый день.
  • Напоследок, хромиум стал падать. Всё сводится к тому, что недостаточно памяти на сервере. Приехали. Переезжать на более мощное окружение из-за Google? Нет!
  • В довершении всего выхватываю OOM на сервере.

Ещё одна гипотеза — мимо. Берусь за следующую. Там же целая бездна вариантов. Какой-то да должен выстрелить.


Web scraper 3: PhantomJS last chance

Собрал из исходников PhantomJS. 

  • Версия 2.1.1 не собирается. В зависимостях Xcode.
  • Текущий релиз Xcode не совместим с системой. Предлагается апгрейд. Xcode 9.2 взлетает.
  • Установка тащит с собой qtbase 5.5. И падает на этой баге. Сделал бэкпорт коммита для 5.6 в 5.5. PhantomJS собран.
  • Запускаю phantomjs в режиме --webdriver=8910 --webdriver-selenium-grid-hub=127.0.0.1:4444.  Падает с ошибкой 
ghostdriver - main.fail
  • Делаю фикс hub_register.js. Он заводится.
  • Собираю тестовый пример и пускаю через Selenium standalone 3.8.1. Вместо фантома выбирается хром! В селениуме поддержку фантома торжественно отключили! 
  • https://github.com/SeleniumHQ/selenium/issues/5295 
  • https://github.com/vvo/selenium-standalone/issues/376
  • Откатываюсь до 3.7.1, пускаю тестовый пример.
  • Фантом стартует на левом порту, вебдрайвер слушает всегда порт 8910, даже если указать другой. Селениум ломится на левый порт фантома вместо порта вебдрайвера.
  • Пересборка ветки bleeding-edge, близкой к версии 2.5, падает на mongoose: 
Undefined symbols for architecture x86_64: "_mg_printf", "_mg_read", "_mg_start", "_mg_stop", "_mg_write"

Очевидно, эта ветвь тупиковая.

Парсер третий: Selenium

Selenium — это чисто точка входа в удивительный мир возможностей использовать разные драйверы. 

Хром и мозилла завелись сразу. 

PhantomJS ругнулся на ghostdriver, зашитый в его кишки. В кач-ве решения предлагают пересобрать его из исходников, захачив ghostdriver.

HtmlUnit валится с ошибкой, вах, не могу поменять read-only поле constructor, исполняя что-то реактоподобное, что висит на целевом ресурсе.

Тут я на распутьи: либо таки тащить chrome или chromium на сервер, либо возиться и пересобирать phantomjs под OS X и Linux.

Парсер третий: PhantomJS deprecated

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

Выяснилось, что PhantomJS официально deprecated. В качестве альтернатив предлагалось тащить гугл на сервер. Такая перспектива меня не порадовала, в результате пошёл смотреть дальше. Недавний тренд показал, что selenium нормально себя показывает применимо к написанию ботов. 

На Hackage обнаружился webdriver, собираю Hello world, смотрю, что из этого выйдет. Если базовые тесты пройдут, потащу к себе.

Наконец-то!

Приехал доминиканский ром.


Честно говоря, я уже и забыл, что просил что-нибудь привезти из Доминиканы, так что бутылка рома была вполне себе неожиданностью. Сделал фотку на фоне решётки Смоленского кладбища. Оно уже было закрыто, так-то я прямо через него хожу. Кстати, насколько ром хорош?
Tags:

Visa calculator, часть 2

Ну вот и всё. Баги разрешены. Пурскрипт, конечно, медленен. Но на тех объёмах данных, для которых пилился калькулятор, это заметно не будет.

  • Конечно же, проблема была в объединении всех возможных диапазонов дат: как пересечений, так и вложенных диапазонов. Такое теперь устраняется.

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

Остаёся всякая мишура предрелизная, типа плашки про кукисы, GDPR compliance страница.

Visa calculator, часть 1

Выпал надолго из колеи. Надо раз в сезон брать отпуск, чтобы хвосты устранять. После перехода со всяких 3rd party трэкеров задач на локальный org-mode что-то да сдвинулось с мертвой точки. Конечно, пока о стабильности говорить не приходится, но тем не менее.

История вопроса


  • Год назад в Эквадоре мы с коллегами рассуждали о минусах частых перемещений по миру: это надо за визами следить, за нерезиденством... Так родилась идея о визовом калькуляторе-валидаторе, об инструменте, с помощью которого можно проверять, сколько осталось дней на сейчас или сколько дней останется если ещё сколько-то дней остаётся, но надо будет скоро опять лететь/ехать куда-то вдаль и надо планировать поездку, исходя из оставшихся дней. Ну или перезаказывать визу.

  • В то же время игрался с PureScript, тогда были breaking changes с обратной совместимостью между его инструментами, связанные с переходом с 0.10 на 0.11, если мне не изменяет память. На выбор из MVC можно было взять Pux или Halogen. Halogen не завёлся, Pux взлетел сразу же.

  • Было решено сделать эксперимент без обращений к серверу. Т.е. чисто клиентское предложение, зачем там сервер. Он там не нужен. Все данные можно обработать прямо там. Заодно и посмотрим, что из этого выйдет.

  • Долго ли, коротко ли, после организации всех связанных с этой тулой задач в org-mode, процесс ускорился и вышел на финишную прямую.

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

Как этим пользоваться

  • Наколотить дат в формате YYYY-MM-DD.

  • Ввести ограничения по визы X дней за Y (другие типы визы заложены, но пока не реализованы).

  • Собственно всё. Любые данные немедленно триггерят вычисления.

Как это работает

  • Выбираются все будущие диапазоны из всех введенных корректно диапазонов.

  • Слева направо по будущим диапазонам для каждого дня идёт вычисление.

  • Смотрим в прошлое на Y дней и ищем, исчерпаны ли X дней. Получаем разницу, от которой и отталкиваемся.

  • Смещаемся по будущему до тех пор, пока лимит не исчерпывается.

Демо

После деплоя вылез ряд недочётов, мешающих заявить о production readiness. Зафиксировал, зарелизил. И да, я снова в форме.
Tags: , ,

Как же я рад...

...тому, что эквадорская веха в моей жизни закончилась. С февраля 2017 по апрель 2018. В общей сложности полгода (6 месяцев) физически там прожил. 

Самые яркие моменты

  • спас человеческую жизнь во время восхождения на вулкан Котопакси;
  • обронил смартфон с половиной заряда батареи в такси и вернул его через 7 часов (отследить через гугл не удалось, отключена настройка была предварительно, когда роуминг настраивал);
  • уборщик вынес купленных сувениров на USD85 как мусор из номера гостиницы, ущерб возместили через 2 дня разборок;
  • отравился ceviches в Эсмеральдасе в кафе при автобусном терминале.

Из странного 

Потерял дефолтное состояние "дома". Теперь у меня нет дома, как такового. Везде свой и везде чужой — одновременно. Все локации ощущаются как коробки со стенами, полом и потолком.