Задать вопрос
  • Нужна ли официальная маркировка покупаемых в SAPE ссылок как реклама?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Нужна ли официальная маркировка покупаемых в SAPE ссылок как реклама?

    Понятие рекламы:
    реклама - информация, распространенная любым способом, в любой форме и с использованием любых средств, адресованная неопределенному кругу лиц и направленная на привлечение внимания к объекту рекламирования, формирование или поддержание интереса к нему и его продвижение на рынке;

    Если это "реклама" конкретного продукта, то нужна, и не только в Sape. То, что Sape не является ОРД - не освобождает от потенциального штрафа рекламодателя, т.е. вас.
    Ответ написан
    8 комментариев
  • Почему docker не видит .env?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    не видит эти переменные

    Что значит не видит, как вы это определили? Посмотрите, что происходит в консоли докера на сервере:
    docker-compose up
    docker logs fruityblox_bot

    Возможные варианты:
    - .env не вошел в .tar образ, соответственно не переехал на сервер вместе с ним.
    - .env не лежит в той директории, где вы выполняете docker-compose up.
    Ответ написан
    3 комментария
  • Как получить из массива все возможные пары элементов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно ли это сделать?

    Можно, законом не запрещено.
    Нужно получить все возможные пары элементов.

    В каком виде? Предположу, что в виде пары в массиве (['a', 'b'], ['a', 'c'] итп), тогда можно так:
    const arr = [ 'a', 'b', 'c', 'd', 'e' ];
    
    const pairs = arr.flatMap((x, i) =>
      arr
        .map((y, j) => i !== j ? [ x, y ] : [])
        .filter((pair) => pair.length),
    );
    
    console.log(pairs);
    
    /*
    [
      [ 'a', 'b' ], [ 'a', 'c' ],
      [ 'a', 'd' ], [ 'a', 'e' ],
      [ 'b', 'a' ], [ 'b', 'c' ],
    ...
    ]
    */
    Ответ написан
    1 комментарий
  • В чем разница между selenium, playwright и puppeteer?

    Mike_Ro
    @Mike_Ro Куратор тега Selenium
    Python, JS, WordPress, SEO, Bots, Adversting
    - В 15 годах писал похожий парсер, используя node, fetch и axios, но сейчас часть сайтов возвращает html без таблиц с ценами, почему?

    - Для чего нужны selenium, playwright и puppeteer, если я могу через fetch и axios все получить?

    Скорее всего проблема в динамическом формировании этих данных на странице. Тут сразу 2 правильных ответа, можете и не можете единовременно:
    - Можете - в инструментах разработчика браузера смотрите, с какого адреса приходят данные и затем дергайте данные напрямую, минуя сам сайт, в таком случае можно продолжать использовать fetch.
    - Не можете - если вариант выше сложен, то вам нужен инструмент, который сможет выполнять js на странице. fetch/axios возвращают первый ответ сервера, т.е. js на тот момент еще не выполнился на странице, соответственно данные не были подгружены. Вопрос рендера js на странице решают инструменты по типу selenium, playwright и puppeteer.
    - Если все же использовать selenium, playwright и puppeteer, что из них лучше на данный момент?

    Вначале нужно определить, что понимается под "лучше":
    - Можно использовать критерий современности, тогда puppeteer отпадает (playwright написала команда puppeteer).
    - Можно использовать критерий производительности, тогда selenium проигрывает playwright сразу по 2 пунктам, по прожорливости и отклику на действия.
    - Можно использовать критерий обнаружения анти-бот системами, тогда selenium (с учетом undetected_chromedriver) проигрывает playwright тем, что имеет явную дополнительную задержку в ~100-300мс при выполнении CDP команд, что прям заметно. Playwright такой задержки либо не имеет вообще, либо она в рамках погрешности.
    Можно ли их с nodejs использовать?

    Selenium написан на java, но так же имеется возможность использования его с nodejs. Playwright вообще написан на ts, все примеры документации и сопутствующие библиотеки с большей вероятность будут писаться под ts по умолчанию.
    - Часто вижу о упоминание CDP в контексте парсинга, это зачем и для чего нужно?

    CDP (Chrome DevTools Protocol) грубо говоря - это некие "низкоуровневые" команды для "chromium based" браузеров, который позволяют этим браузером управлять. В playwright так реализованы большинство "высокоуровневых" команд, например: при использовании playwright мы пишем await locator.getAttribute(name), а playwright использует аналогичную команду из CDP DOM.getAttributes или DOM.describeNode.
    - Что использовать для отправки сообщений в телегу?

    Если речь идет об nodejs, то Telegraf.
    Ответ написан
    1 комментарий
  • Как проверить метод POST при тестировании API?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Комментировать
  • Отправка формы html?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    данные формы не поступают в таблицу.

    Что значит "не поступают"? Что делаете и что при этом происходит? В консоли что? Пока придется гадать...
    const pool = mysql.createPool

    Вижу подключение к бд, но проверок успешно ли установлено соединение - нет.
    app.post("/two.html", urlencodedParser, function (req, res) {

    Вижу использование urlencodedParser для обработки данных формы, но не вижу его объявления, попробуйте так (express 4.16.0+):
    // Подключение к бд
    const urlencodedParser = express.urlencoded({extended: false});
    // app.post эндпоинт

    if(!req.body) return res.sendStatus(400);

    Больше инфы:
    console.log("req.body);
    if (!req.body) return res.status(400).send("Данные не были отправлены");

    if(err) return console.log(err);

    Больше инфы:
    if (err) {
      console.error('Error:', err);
      return res.status(500).send('Server error');
    }


    const name = req.body.name;
    const usluga = req.body.usluga;
    const tel = req.body.tel;

    Так симпатичнее:
    const {name, usluga, tel} = req.body;
    < form action="/two.html" method="post">

    Возможно, в будущем, будет лучше указать другой эндпоинт для приема данных с формы?
    <form action="/submit-form" method="post">
    Ну и на всякий, в вашем случае, two.html должен лежать рядом с server.js.
    Ответ написан
    2 комментария
  • Как защитить ленд от дублей при A/B тестировании через 302 редирект?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    часть трафика попадает на вариант B

    Вопрос: хватает ли связки 302 + на варианте B, указывающего на основной URL (вариант A) или есть риск вылетов?

    Предположим, что на страницу Б временно редиректит (302 (temporary move)) 50% посетителей, со стороны поисковика это будет выглядеть как минимум странно или даже подозрительно.

    Попробуйте готовые сервисы А/Б тестирования, например вариокуб (или аналоги). Все тексты, верстка и скрипты вставляются на страницу в момент захода посетителя (без редиректов), эти изменения с большей вероятностью не видны поисковым системам, + не нужно самому управлять редиректами.
    Ответ написан
    Комментировать
  • Как детектить Playwright?

    Mike_Ro
    @Mike_Ro Автор вопроса
    Python, JS, WordPress, SEO, Bots, Adversting
    Отвечу сам себе - сам playwright с патчами (в отличие от selenium) никак не детектить, но не модифицированный (или плохо модифицированный) браузер имеет множество несоответствий с тем, за кого себя выдает бот, их и нужно искать.
    Ответ написан
    Комментировать
  • Как отслеживать парсеров?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    можете рассказать как вы отслеживаете, что вас начали просить через какой-нибудь скрипт

    Либо готовыми средствами антибот защиты, либо самописными.
    Как анти-бот системы определяют ботов и как от них защищаться?
    учитывая что бы получить доступ к сайту нужна авторизация

    Прошли аутентификацию, получили куки и дальше можно парсить. В чем сложность?
    Ответ написан
    Комментировать
  • Помогает ли разметка schema.org влиять на видимость сниппетов QA в поиске?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Вопрос в том, насколько эта разметка реально влияет на отображение расширенных сниппетов в Google и Яндекс.

    Влияет, не сильно, но насколько "не сильно" - это могут рассказать лишь разработчики алгоритмов ПС. В любом случае, ПС предпочтет сайт с разметкой, чем без нее, при прочих равных.
    Достаточно ли только корректно реализованной разметки, чтобы в сниппетах появились рейтинги и вопросы/ответы?

    Разметка помогает сделать страницу подходящей для отображения в расширенных сниппетах (rich results), но сама по себе она не гарантирует появление таких элементов, как вопросы, ответы или рейтинги. Разметка работает как усилитель видимости, в дополнению к "трастовости" домена, качественному контенту и другим seo факторам (трафик, ссылки, ПФ итп).
    Ответ написан
    2 комментария
  • Как убедиться, что одностраничный сайт (SPA) корректно индексируется поисковыми системами Google и Яндекс?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Основной контент загружается динамически через JavaScript. Появились сомнения, что поисковые системы (Googlebot и робот Яндекса) корректно видят и индексируют такой сайт.

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

    Самый простой вариант, оператор фиксирующий количество слов в ключевой фразе - "ключевая фраза", затем копируем строку текста из динамики и вставляет ее в поисковик, если сайт найдется, то именно этот блок текста индексируется.
    Нужно ли делать SSR или пререндеринг, или современные поисковики уже справляются с рендерингом?

    С рендерингом динамики они справляются давно, а вот ранжирование такого контента оставляет желать лучшего. Я считаю, что на 2025 год SSR/SSG обязателен, для успешной конкуренции в поисковой выдаче.
    Ответ написан
    3 комментария
  • Из-за чего возникает ошибка неверный дескриптор?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вероятно код парсера падает до явного закрытия сессии, сборщик мусора python удаляет все ссылки на уже не нужный объект (python вызывает __del__ для объекта driver), затем вы явно пытаетесь закрыть несуществующий объект. Чтобы этой проблемы не было, используйте исключения и закрывайте сессия предсказуемо, либо используйте контекстный менеджер with (хотя автор и сообщает, что это больше не требуется), тогда явно ничего не нужно будет закрывать:
    import undetected_chromedriver as uc
    
    with uc.Chrome() as driver:
        pass
    
    print("Успех или ошибка? Сессия все равно успешно закрыта!")

    Если не помогло, то вот еще решение https://github.com/ultrafunkamsterdam/undetected-c...
    Ответ написан
  • Как анти-бот системы определяют ботов и как от них защищаться?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Если я отправлю гет запрос из консоли то увидит-ли меня сайт где именно я нахожусь?

    Напрямую нет, но косвенно можно понять это по ip адресу исходящего запроса.
    Если я будут использовать селениум то увидит-ли меня сайт где именно я нахожусь?

    Напрямую нет, но косвенно можно понять это по ip адресу + гуглите, что такое утечки dns и как можно определить настоящий ip (минуя прокси) через webrtc.
    Селениум хороший анти-детект браузер? Видел еще playwright он лучше?

    Selenium - это вообще не антидетект браузер, а лишь программа, которая использует browser-driver для управления браузером. Selenium + undetected-chromedriver простая защита сайта не обнаружит, но вот средненькие антибот системы он уже часто не проходит. Playwright хуже определяется антибот системами.
    Как обычно парсят сайты со сложной защитой? Где продаются такие боты?

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

    Профессионально обнаружением ботов занимаются отдельные команды или даже целые компании (Radware, DataDome, Cloudflare, Imperva, Arkose Labs, HUMAN Security, Akamai, hCaptcha итп). Обнаружение сводится к прямому и косвенному методам.

    Прямые методы обнаружения:
    - Частота запросов и "доверие" (trust) к конкретному ip.
    - Проверка заголовков User-Agent. Заголовки от iphone, версия браузера от андройда, а размер дисплея от ноута - надежно!
    - Отпечатки рукопожатий TLS/QUIC (векторы JA3/JA4, ALPN, расширенный порядок).
    - Проверка выполнения JS.
    - Обнаружение признаков использования драйверов браузеров (window.navigator.webdriver, window.document.__webdriver_script_fn итп), открытости DevTools итп.
    - Шрифты: через js получают список шрифтов (откуда у вас Ubuntu шрифт на Андройде?), затем выборочно печатают на canvas изображение нужным шрифтом или печатают невидимый шрифт без канваса (применяют css свойство с найденным шрифтом), затем замеряют размеры результата и сверяют его с эталоном.
    - Видеокарта: через js рисуют на canvas невидимое изображение с цифрами, спецсимволами и смайликами, затем получают представление изображения в виде кода. Через WebGl можно нарисовать 3D изображение.
    - Камера. Как это у вас 3 камеры на samsung a32, если их 4?
    - Гироскоп, компас, акселерометр (все это без разрешения работает на андройде). Почему ваш гироскоп не двигается несколько минут подряд, хотя геолокация и ip gsm вышек меняются?
    - Анализ аудио рендеринга без разрешения на доступ к аудио (используется только программный аудио стек), где собираются уникальные артефакты обработки звука в зависимости от аппаратного обеспечения. Генерируется аудиосигнал, который обрабатывается через цепочку фильтров и эффектов (динамическая компрессия, частотные изменения, реверберация, изменение частотной или амплитудной модуляции итп).
    - Остальная проверка характеристик браузера->устройства: процессор, оператива, дисплей, плагины, часовой пояс, язык. У вас в браузере установлен русский язык, тайм-зона германии, последняя геолокация час назад в италии, а сейчас вы используете ip адрес гондураса, и как ему удается свайпать по НЕ сенсорному дисплею? - чистокровный человек, пропускаем! ;)
    = Собираем данные, хэшируем и получают относительно уникальный отпечаток (fingerprint). Уникальность заявляется разная, вплоть до 99%.

    Косвенные методы обнаружения:
    - Частота запросов и "доверие" (trust) к конкретному ip. Внезапно начался наплыв пользователей, да и еще примерно с одинаковыми характеристиками устройств, при этом хозяин сайта не давал рекламы или как то привлекал пользователей...
    - Нестандартный скролл/свайпы/клики у пользователей, ошибки и скорость ввода текста. Внезапно резко наплывшие пользователи стали скролить примерно до одного блока, делали 3 свайпа по 5-6 точек в каждом, хотя до этого все скролили по разному...
    - Нестандартная реакция на всплывающие окна. Скролл поверх фиксированного окна - бесценно... ;)
    - Нестандартная последовательности посещенных страниц.
    - Нестандартное количество проведенного времени на странице.
    - Клики по невидимым для живого человека ссылкам, заполнение невидимых полей и отправка формы, когда она не может быть отправлена, в результат не верной js валидации полей - это вообще не стареющая классика.
    - Геолокация - только с разрешения, но после разрешения можно получить много косвенных данных для анализа. Какая точная у вас геолокация, всегда до метра, и прыгает всегда по 10 метров, а у других на таком же устройстве все дергается как го*но в проруби...
    = Собираем данные, заливаем в нейронку и сравниваем с эталонными пользователями.

    Это лишь самые распространенные методы обнаружения, которые используют большинство топовых антибот систем.
    Ответ написан
    6 комментариев
  • Как в шаблоне выделить несколько экземпляров модели чекбоксами и по нажатию на кнопку получить список выделенных экземпляров?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Предлагаю использовать стандартный вариант с html (предварительно, нужно найти этот шаблон). Галочка + выпадающий список (select) + кнопка отправки + уведомление в шаблоне будут выглядеть примерно так:
    <!-- Уведомления -->
    {% if messages %}
        <ul class="messages">
            {% for message in messages %}
                <li class="{{message.tags}}">{{message}}</li>
            {% endfor %}
        </ul>
    {% endif %}
    
    <form method="post" action="{% url 'view_name' %}">
        {% csrf_token %}
        <table>
            {% for item in items %}
                <tr>
                    <!-- Здесь другие столбцы -->
                    <td><input type="checkbox" name="selected_items" value="{{item.id}}"></td>
                </tr>
            {% endfor %}
        </table>
    
        <select name="action">
            <option value="action_1">Действие 1</option>
            <option value="action_2">Действие 2</option>
        </select>
        <button type="submit">Применить</button>
    </form>

    Затем, в представление обрабатываем данные из шаблона выше, пусть это будет view_name. Например, некоторые основные моменты:
    # Получаем из POST запроса выбранные items
    selected_ids = request.POST.getlist('selected_items')
    
    # Проверить, есть ли что в selected_ids, если нет, сообщить юзверю, пусть жмет сильнее
    if not selected_ids:
        messages.warning(request, "Товарищ Юзверь, жми сильнее")
        return redirect('view_name')
    
    # Получаем action
    action = request.POST.get('action')
    
    # Смотрим, что пришло в action, затем выполнить нужное действие, пусть это будет следующее:
    
    # Получаем из бд все объекты по списку selected_ids одним запросом
    items_to_update = ItemModel.objects.filter(id__in=selected_ids)
    
    # Обновляем поле, пусть это будет is_selected
    updated_count = items_to_update.update(is_selected=True)
    
    # Обрабатываем успешный успех
    messages.success(request, f"Молодец Юзверь, успешно отработано: {updated_count} элементов, возьми с полки пирожок")
    return redirect('view_name')

    Ну и условная модель:
    from django.db import models
    
    class ItemModel(models.Model):
        title = models.CharField(max_length=200)
        is_selected = models.BooleanField(default=False)
    
        def __str__(self):
            return self.title
    Ответ написан
    1 комментарий
  • Сайт на виртуальном хостинг Timeweb с размером 107,93 КБ даёт ответ сервера 73 мс. Что делать?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Возможно это от того, что кеширование настроено на Cache-Control: no-cache?

    wpo-cache-status: cached указывает, что страница кэшируется на уровне wp оптимизации (wp-optimize?). Но директива no-cache может конфликтовать с этим, вызывая дополнительные запросы к серверу. Поэтому, это самая наиболее вероятная причина, из тех, что вы предоставили.

    TTFB 89 мс это время до получения первого байта, что является хорошим показателем. Сервер отвечает быстро, так что проблема не в серверной обработке.

    Настройте правильное кеширование. Для статических страниц рекомендуется использовать cache-control: public, max-age=3600 (час, но я бы указывал больше). Это позволит браузеру хранить страницу локально и не запрашивать её повторно.

    Используйте google pagespeed insights или gtmetrix для анализа скорости загрузки. Они покажут, где и что тормозит.

    Ну и по классике, если это shared хостинг, то долбите поддержку таймвеба, они нормально отвечают и решают вопросы.
    Ответ написан
    Комментировать
  • Что за подсветка в PyCharm?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Похоже на предупреждение или рекомендацию оформленное не подчеркиванием, а изменением background, открыть настройки, перейти сюда File | Settings | Editor | Color Scheme и искать в одном из разделов: General, Language Defaults или Python.
    Ответ написан
    Комментировать
  • Как на VPS сервере нажать чтобы файл сохранился?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    открыл файл

    Чем открывали? nano (nano /path/to/file)? Если да, то внизу nano имеются подсказки по горячим клавишам:
    - ctrl + o - сохранить, редактор спросит имя файла для записи, если нужно просто сохранить - ничего не меняем и жмем enter.
    - ctrl + x - выйти из редактора, если имеются не сохраненные данные, то редактор так же предложит их сохранить.
    Если это был vim, то так:
    1. Нажмите клавишу esc один или два раза.
    2. Наберите :wq (записать и выйти).
    Подключался через mobaxterm

    Слева в mobaxterm есть sftp (файловый менеджер). Вы можете найти нужный файл там, кликнуть по нему правой кнопкой мыши и выбрать "Open with default text editor". Файл откроется в вашем редакторе по умолчанию в той операционке, с которой подключаетесь. При сохранение такого файла - mobaxterm автоматически загрузит его обратно на сервер.
    Ответ написан
    2 комментария
  • Дублирующийся контент - действительно ли это так плохо?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    На странице продукта раздел "дополнительная информация" дублируется, один раз для десктопа, один раз для мобильных.

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

    Небольшие блоки (небольшие!) можно скрывать под разные дисплеи, используя css @media + display:none, а вот css свойства visibility и opacity помогают сделать тоже самое, но чтобы они продолжали индексироваться.
    Сейчас штатный сеошник ставит в приоритет задачу удаления двойного контента, аргументируя это тем, что google со своим ии стал очень придирчивым и считает такой контент чисто повтором и потому спамом.

    Не стал, а был, не только гугл, но и яша.
    При этом на мой вопрос "а как тогда быть с меню", которое очень часто дублировано для разных устройств, у нас конкретно так. При том, что меню развернутое и содержит ссылки, слышу ответ что меню google не считает за спам, короче, "это другое" ©

    Если меню оформлено нужными тегами + смазано микро-разметкой + (там всего несколько слов, а не абзацы текста + заголовки) + 100500 одинаковое повторяющиеся меню в разных частях страницы (заказчик хочет) оформленное тегом <noindex> = не считает, и даже больше скажу - понимает, что это меню и предлагает "быстрые ссылки" под сниппетами в органике.
    Ответ написан
    Комментировать
  • Как создавать произвольные блоки?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Есть ли в WP возможность создавать наподобие страниц и записей, ещё и произвольные блоки и выводить их в теме по id?

    Да, это стандартная методика - WordPress Block themes, только по id выводить их не требуется. Можно изучить их работу на базовых темах WP - Twenty и Twenty-Four.
    Надеялся, что в WP есть что-то типо реестра переменных или блоков. Но ничего даже близко похожего не вижу.

    А это уже более старый вариант, для этого обычно используются кастомные поля, рекомендую - carbon fields.
    Ответ написан
    1 комментарий
  • Парсинг на Python при помощи tor?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Относительно недавно начал заниматься парсингом. Использую tor.

    Жестко.
    Попробовал достаточно много способов из инета, но ip так и не меняется

    Но нам вы их конечно же не показали.
    Хотелось бы узнать работает ли вообще сейчас базовый парсинг с помощью tor

    Технически - работал, работает и будет работать. Функционально - не работал и не будет работать, т.к. ip выхода тора палятся так, как не палятся спам-ip дата-центров, ну и про скорость и стабильность работы тора не стоит забывать.
    либо же нужно искать обходные пути?

    - Если денег нет - использовать публичные списки ip проксей.
    - Если денег почти нет - использовать не публичные списки ip проксей.
    - Если деньги есть - использовать мобильные прокси.
    - Если деньги ЕСТЬ! - использовать резидентские прокси.
    Ответ написан
    Комментировать