Фрилансерский блокбастер или история одного непростого заказа

в 17:16, , рубрики: фриланс

Здравствуйте, меня зовут stalinko и я фрилансер. Работаю в основном через UpWork. В качестве подработки обожаю писать скрейперы. Это такие программы, которые парсят (выкачивают) данные с других сайтов.

Прилетел мне заказик, вполне стандартный: написать программку, чтобы раз в сутки пробегалась по всем товарам интернет-магазина и сохраняла их в БД клиента. Ну и чтобы эти товары можно было через браузер смотреть, сортировать, фильтровать.

Заказ стандартный абсолютно. Я оценил его в 8 часов на скрейпер + 8 часов на веб-страничку. Клиент захотел по фиксированной цене работать, поэтому я предложил $700, в итоге сторговались на $600. Заключили контракт, работаю.

В самом начале оказалось, что товаров более 800.000. Они разбиты по более чем 7000 страниц. И некоторые параметры можно узнать только если открыть страницу с товаром. Стало веселее. Потому что 800.000 запросов — это уже ощутимо для любого сайта кроме гугла.

Начал писать и тут оказалось, что сайт довольно строго банит скрейперы, если слишком часто посылать запросы. Проблема… Если посылать запросы с задержкой то весь парсинг растянется на пару месяцев, это только первый проход! Что делать?

Решили использовать прокси, да не простые, а rotating proxy, которые меняют свой IP каждые 10 минут. Стало бодрее. Но оказалось, сайт банит вообще всех, кто шлёт запросы подряд в течение нескольких минут. Т.е. даже с проксями нам нельзя было скрейпить на максимальной скорости. Пришлось вводить таймауты, и в итоге удалось добиться сокращения времени до 2 недель.

Но это всё равно много. Начал активно думать днём и ночью над этой проблемой и придумал. Странички с продуктами можно скачивать не с сайта напрямую, а из гугл-кеша! Данные на страничках практически не меняются, так что кеш нас полностью устраивает. Гугл не так строг к скрейперам, да к тому же у меня были наработки по скрейпингу гугла с предыдущего проекта. В общем запустил! К сайту обращался только за списком товаров, либо за товарами, которых нет в кеше. Всё остальное — из гугла. Удалось сократить срок до 4 дней!

Заказчик доволен. Видит, что всё работает ну и оплатил заказ полностью. Я тоже доволен, но недолго…

Вдруг запросы за списком товаров перестают работать. На любой запрос прилетает автоматически ошибка, что вы должно быть бот и идите нахер. Я начинаю подозревать самое худшее — что админ сайта нас спалил и начал играть против нас. Что делать? Со стороны клиента всё выглядит так: было чёткое ТЗ и есть сломанная программа на выходе. Как бы вы поступили в данном случае? Отдать деньги? Но я честно проработал даже больше чем рассчитывал, и в исходных условиях программа работала отлично. Продолжить дорабатывать? Но если против нас играет админ сайта, то это может растянуться бесконечно. Потребовать ещё денег? В принципе да, но довольно неприятный вариант для клиента. Не факт, что он согласится и не обидится.

В итоге психанул и решил бесплатно всё доделать. Потратил ещё полдня. Нашёл решение — сайт банит стандартный протокол http1.1. Если работать по http2, то всё работает прекрасно.

Починил. Рассказал всё клиенту. Он был впечатлён и сказал, что если программа всё докачает нормально через 3 дня, то он заплатит мне бонус за старания. Это мне понравилось )

Но через 2 дня программа ломается снова… Опять та же история — какой бы запрос ни посылал, автоматически ошибка 403 (идите нахер боты). Снова смог починить, путём добавления ещё одного http-заголовка. И программа продолжила работать.

В итоге докачали мы все товары. Клиент был очень рад и на радостях заплатил мне ещё $500 бонуса. Вот это нормальный разговор! В принципе, на такую сумму я и переработал.

Но проходит ещё день и программа ломается снова… Я добавляю ещё один http-заголовок… Меня это начинает напрягать т.к. бесконечно это продолжаться не может. Нужно кардинально другое решение.

И тут я вспомнил, что у них есть мобильные приложения, а значит и мобильное API. Скачал андроид-приложение. Попытался ловить его запросы, но во-первых они были шифрованные, а во-вторых, приложение даже не работало, авторизация не проходила вообще. Думаем дальше… Оказалось, андроид приложения можно легко декомпилировать. Прямо онлайн. Кому интересно — нагуглите сходу сами. Таким образом, из apk получается чистый исходный код. Всё хорошо, но оказалось, что единственное API у приложения — это авторизация. Всё остальное через webview — беда… Но, погодите… Я видел скрины ios-приложения и они выглядят иначе! Может быть там API? Декомпилировать ios-приложения оказалось не так просто как андроид, а без яблочного устройства его никак не запустить. Тут мне на помощь пришёл коллега и смог выдрать API-запросы из ios-приложения, и о чудо! Нашлось API для получения списка товаров!

Начал изучать его. Попробовал загуглить. Наткнулся на документацию от бывших разработчиков в открытом доступе, они в виде github-gist сохраняли куски. Там было мало интересного, но кое-что я нашёл.

Решил попридержать мобильное API до худших времён. А тем временем основной скрейпер падал каждые 1-2 дня. Поведение сайта постоянно менялось. Админ явно играл против нас. Но решение каждый раз было простое — пара заголовков http и вуа-ля оно работает дальше )

Но меня снова начало напрягать, что я продолжаю работать за бесплатно. Предложил клиенту почасовую ставку. Он согласился, но в ответ предложил работать через PayPal вместо UpWork. Таким образом договорились, что он мне платит меньше на сумму комиссии UpWork. Все довольны.

Ещё через пару дней сайт начинает зверствовать просто нереально. Сначала он вдруг поменял формат данных. Вместо json стал рандомно отдавать html. Ну это не так страшно как то, что произошло дальше.

Они подключили анти-бот защиту от perimeterx.com. А это уже довольно лютая штука. Смысл такой: в браузере генерируется некий cookie, по очень сложному алгоритму, и сервер проверяет эту куку при каждом запросе. Имитировать такое программно оказалось сложновато. Поэтому в итоге решено было воспользоваться козырем и перейти на мобильное API. Решение на API взлетело на ура. Во-первых, скорость выросла в 5 раз т.к. за один запрос мы получали не 120, а 600 товаров, а во-вторых, в мобильном API нет никакой защиты. Пока. Тьфу-тьфу.

Проект продолжает жить и работать. Сайт, который мы скрейпим, я не назову, даже не просите. Мало ли кто тут сидит на Хабре. Скажу лишь, что сайт американский и продаёт одежду.

Автор: Барак Адама

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js