Методика
Мы не переписываем цены с витрин, а считаем, во что обойдётся ваш объём у каждого сервиса. Здесь написано, как именно: откуда берётся каждая цифра, что значит отметка рядом с ней, когда цена перестаёт участвовать в сравнении и чего мы не делаем ни за какие деньги. Страница обновляется вместе с данными — числа в ней посчитаны на той же сборке, что и таблицы.
Что здесь есть на самом деле
Сейчас в каталоге 69 цен по 21 сервису в 10 типах прокси. У 67 из них стоит ссылка на страницу, где мы эту цифру видели, — по ней можно проверить нас руками.
Это немного, и мы не делаем вид, что много. Порог включения сервиса — не «нашли сайт», а «умеем получать цену и знаем, как она устроена»: сервис, чью цену мы не можем ни получить автоматически, ни объяснить, в каталог не идёт. Расти быстрее, чем успеваем проверять, — убыток, а не рост: двести цен неизвестной свежести хуже сорока проверенных.
Как считается «итого»
Цена у прокси почти никогда не одна. Обычно это лестница скидок: чем больше берёте, тем дешевле единица. Мы берём ту ступень, в которую попадает ваш объём, умножаем на объём и сравниваем с минимальной покупкой, если она есть.
но если итог меньше минимальной покупки — итогом становится она
Второе правило важнее первого. Пример: сервис берёт $2 за гигабайт, но не продаёт меньше чем на $50. Вам нужно 10 GB — по цене это $20, а заплатите вы $50. Строка получает отметку «минимум $50», и в сравнении стоит именно $50: сравнивать цену, которой не существует для вашего объёма, бессмысленно.
Отсюда же следует, почему цифра с главной страницы сервиса нам не годится. «От $1,75 за GB» на большинстве витрин — это цена терабайта. На объёме, который берёт живой человек, она другая, иногда в три раза.
Откуда берётся цена и что значит отметка рядом с ней
У каждой цены на сайте стоит уровень доверия. Это не оценка сервиса — это честное описание того, как цифра попала к нам.
| Отметка | Что за ней стоит | Сейчас |
|---|---|---|
| проверено | Проверено человеком. Цену открыл, прочитал и внёс администратор каталога — на той же странице, где её видит покупатель. | 25 |
| по API | Из API сервиса. Сервис отдал цену программно, о самом себе. Цифра приходит отдельным полем, её не нужно вынимать из текста. | 7 |
| с сайта | С официальной страницы тарифов. Снято автоматически со страницы самого сервиса; адрес страницы и дата сохранены. Цифра верная на момент сбора, но формулировку на витрине мог понять неверно робот. | 37 |
| по сторонним | По сторонним источникам. Сам сервис цену не публикует. Цифра совпала минимум у 3 независимых источников, но официального подтверждения у неё нет. | 0 |
Порядок именно такой: человек выше машины. API отдаёт прайс-лист — то, что у сервиса записано в системе. Покупатель видит витрину, а на ней бывает другое: акция, региональная цена, тариф, который в системе значится активным, но со страницы снят. Человек, открывший страницу оплаты, смотрит ровно на то, что заплатит покупатель, — поэтому его запись бьёт машинную. API при этом выше разбора страницы: там цифра приходит отдельным полем, а не вынимается из текста.
Отметка «по сторонним» стоит особняком и в общую таблицу сравнения не попадает — для неё отдельный блок с объяснением. Такая цифра засчитывается только если совпала минимум у 3 независимых источников, а независимость считается по домену: три перепечатки одного пресс-релиза — это один источник, а не три.
Цифра, которую мы не смогли отнести ни к одному уровню, на сайт не выходит вовсе. Она остаётся в базе и ждёт проверки человеком.
Сколько цене лет
Дата стоит у каждой цены, и это не украшение. Сломанный разбор страницы выглядит снаружи ровно как «цена не менялась»: и то и другое — тишина. Поэтому у нас необновление считается отказом, а не покоем.
- Цена старше 30 дней получает на сайте отметку «не проверяли N дней» и выходит из выбора «дешевле всех» и «оптимально». Из таблицы она не исчезает: цифра с датой полезнее пустоты, а вот объявлять победителем по месячным данным нельзя.
- Цена старше 45 дней не показывается вообще.
- За 16 дней до отметки мы получаем предупреждение и идём перепроверять. Это внутренняя часть, но она объясняет, почему цен с отметкой обычно нет.
Возраст считается по поздней из двух дат — когда цену видел сбор и когда её подтвердил человек. Подтверждение человеком — это тоже проверка, и притом высшего уровня.
Как цены собираются
Четыре способа, и они не взаимозаменяемы.
- API сервиса. Самый надёжный: цифра приходит от самого сервиса отдельным полем.
- Страница тарифов. Цена ищется по осмысленному тексту рядом с ней («starting at just $2/GB»), а не по оформлению: вид разметки у всех проверенных сервисов меняется при каждой выкладке, а формулировка — нет. Если формулировка изменилась, правило честно не находит ничего вместо того, чтобы подобрать случайное число со страницы.
- Данные, из которых страница рисует цену. У части сервисов витрина без скрипта пуста, но в самой странице лежит то, из чего она рисуется, — с названиями продуктов, сроками и объёмами. Мы берём это только там, где цифра совпала с прочитанной человеком в браузере.
- Руками. Не позор, а честный четвёртый путь: у сервиса стоит защита от ботов, или цена есть только после нажатия. Причина всегда названа, и уровень доверия у такой записи высший — её читал человек.
Чего мы при сборе не делаем
- Не обходим защиту. Ответ 403 или проверка на робота значит «нельзя»: сервис переходит в ручной режим, и всё. Ни капчи, ни подмены отпечатка, ни чужих аккаунтов.
- Уважаем robots.txt. Проверка встроена в сам сбор и не отключается настройкой: правило, которое можно обойти параметром, — не правило.
- Представляемся честно. Наш сборщик называет себя и своё назначение, а не притворяется браузером.
- Держим паузу между запросами к одному сайту и ходим к каждому сервису раз в сутки.
- Храним адрес и дату у каждой цифры, а при разборе на своей машине — и копию самой страницы, чтобы можно было доказать, откуда взялась цена. Ночной сбор идёт в Cloudflare, где файлов нет: там от страницы остаются адрес и дата. Раньше на этом месте было написано «сохраняем копию страницы» без оговорки — про ночной сбор это было неправдой.
Кроме этого у каждого правила есть коридор правдоподобия: цена вне него не публикуется, а помечается как подозрительная. Это ловит случай, когда правило зацепилось не за ту цифру на странице, — например поймало $0,95 за гигабайт мобильных там, где ниже $1 таких цен не бывает.
Ловушки, на которых мы уже ошибались
Этот раздел здесь не для красоты. Каждая ошибка ниже была допущена и исправлена, и каждая давала цифру, выглядящую совершенно правдоподобно.
Слово «от»
«От $2 за гигабайт» у одного сервиса значит цену входа, у другого — цену на максимальном объёме. У нас из-за этого стояло $2,40 вместо настоящих $4,00. Теперь запись, снятая по слову «от», не публикуется, пока человек не выяснит цену входа: она остаётся в базе с пометкой «нужна проверка».
Срок
Три сервиса из наших публикуют цены не за месяц: два за неделю, один за сутки. У одного из них срок написан только на странице типа, а на сводной странице цен не написан вовсе — недельная цифра там выглядит как месячная и ровно вдвое дешевле. Ещё у одного в данных страницы лежат сразу три варианта — месяц, квартал и год, — и порядок между ними случайный: взять первый значило бы опубликовать $33,60 за адрес вместо $3,50. Срок мы теперь выбираем всегда явно.
Разметка для поисковика
Часть сервисов выкладывает готовые цены в служебной разметке страницы — той, которую читают поисковые роботы. Мы её не берём, и вот почему. У одного сервиса там восемнадцать ступеней, из которых на видимой странице есть одна: остальные покупатель не увидит нигде. У другого в разметке стоит валюта «доллары» и цена 0,50, а рядом в тексте — «от 49 ₽ в неделю». У третьего цены в разметке на 15% ниже витринных, потому что это его распродажа, и срок действия у них истёк три недели назад. Цена, которую нельзя показать пальцем на странице сервиса, у нас называется слухом.
Совпадение подстроки
Самая обидная. Поиск числа «5.50» в коде страницы даёт совпадения — и все они оказываются координатами внутри векторной картинки. У другого сервиса «2.50» нашлось в записи времени «…:32.500Z». Поверив счётчику совпадений, можно написать правило, читающее графику как цены. Поэтому цифра всегда проверяется по окружающему тексту, а не по факту присутствия в коде.
Почему мы не сравниваем типы между собой
У типов разные единицы оплаты: у резидентских — гигабайт трафика, у ISP и серверных — адрес в месяц, у мобильных портов — порт, у Scraping API — тысяча запросов. «Дешевле» между гигабайтом и адресом не существует, и любая таблица, где они стоят в одном столбце, вводит в заблуждение. Поэтому сравнение всегда идёт внутри одного типа.
По той же причине мы не выделяем «дешевле всех», если в типе меньше 3 предложений: при таком выборе это значило бы «единственный, который мы нашли».
И мы не пересчитываем валюты. Сервис, который торгует в рублях, в сравнение не идёт: курс на день сбора — не наша цифра, а записать рублёвую цену как долларовую значит потом не отличить её от настоящей.
Свои замеры
Цена — это половина ответа. Вторая половина в том, работает ли купленное: какая доля запросов доходит, какая задержка, сколько адресов в выдаче реально разные, попадает ли заявленное гео. Это мы измеряем сами, через оплаченные аккаунты.
Правила у замеров свои, и они строже, чем у цен:
- Мишень наша собственная. Проверять «пускает ли нас чужой сайт» — это автоматический стук в чужой сайт с подставного адреса, то есть ровно то, от чего мы отгородились при сборе цен.
- Рядом с каждой цифрой стоит число запросов, из которых она посчитана.
- Единичный прогон не публикуется как факт. «Не дошло» и «мы не ходили» — разные вещи, и мы их различаем.
- Если замер сделан на одном тарифе, а цена в строке от другого, это сказано вслух.
Сейчас замеров 1 по 1 сервису, всего 20 запросов. Это самое начало: пока замеров столько, они говорят о конкретном прогоне, а не о сервисе, и мы не станем делать вид, что это иначе.
Партнёрские ссылки и деньги
Переходы на IPRoyal, Webshare — партнёрские: если вы там что-то купите, мы получим вознаграждение. Остальные ссылки обычные. Список назван поимённо, а не «некоторые ссылки на этой странице»: общая формулировка технически не врёт и не сообщает ничего.
- Место в таблице не продаётся. Порядок считается из цены на заданный объём, одинаково для всех сервисов, и вознаграждение в расчёт не входит никак.
- Своих прокси мы не продаём. Продавец не может судить конкурентов.
- Мы считаем переходы к сервисам, чтобы понимать, что людям полезно. Ничего о посетителе при этом не собираем.
Признаки сервисов: «не выяснено» — это не «нет»
Кроме цен мы ведём признаки: даёт ли сервис счёт для юрлица, есть ли SOCKS5, сгорает ли трафик, какие сайты закрыты. У каждого признака три состояния, а не два: да, нет и «не выяснено». Пустое место означает, что мы не проверяли, — и никогда не превращается в «нет». Разница видна на сайте.
Чего мы не делаем
- Не продаём места в рейтинге и не согласовываем порядок с сервисами.
- Не пишем обзоры, которых не проверяли, и не покупаем отзывы.
- Не сравниваем типы между собой и не пересчитываем валюты по курсу дня.
- Не публикуем единичный замер как установленный факт.
- Не обходим защиту чужих сайтов.
- Не переводим страницы машиной.
- Не добавляем сервисы быстрее, чем успеваем проверять их цены.
Как проверить нашу цифру
У каждой цены стоит дата и ссылка на страницу, где мы её видели. Откройте ссылку и сверьте — это и есть смысл того, что здесь написано. Если цифры расходятся, верна та, что на сайте сервиса: тариф могли поменять после нашей проверки, и по дате видно, когда мы смотрели.
Цены и условия у прокси-сервисов меняются в любой момент, и перед покупкой стоит сверяться у сервиса. Мы отвечаем за то, что цифра была такой на указанную дату и получена описанным здесь способом, — не за то, что она такая сейчас.