Создание сервиса по обнаружению публичных HTTP-прокси

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 391]


    Публичные HTTP и HTTPS прокси сервера используются в технологиях черного и серого SEO-продвижения, для сокрытия настоящего IP-адреса. Они делятся по разной степени приватности и географическому признаку. Так же помимо HTTP-прокси серверов существуют и SOCKS-прокси, но это довольно редкий зверь.

    Инструкция по созданию своего сервиса HTTP-Proxy

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

    Анализ цен на proxy-списки у ряда игроков этого рынка

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

    Рассмотрим наиболее популярные сервисы:

    https://proxy-sale.com/

    Proxy-sales

    Proxy sale

    Цены на прокси вполне демократичные по сегодняшним меркам, помимо HTTP/HTTPS заявлены так же SOCKS. Имеется тех поддержка 24/7.

    http://www.eliteproxyswitcher.com/buyproxy.php

    Eliter proxy

    От 9$ в месяц 302 прокси, заявлено максимум 5000 прокси за 60$ в месяц

    https://buy.fineproxy.org/

    fileproxy

    Ценовая политика не совсем понятная, но получается около 45$ в месяц.

    http://proxyhub.ru/

    proxyhub

    Цена за доступ к спискам прокси серверов 6.6$ или 350 руб/месяц.

    https://kingproxies.com/plans

    kingproxy

    Минимальный тарифный план 20$ в месяц.

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

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

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

    Получение актуальных данных по имеющимся спискам прокси

    Довольно популярным типом приложений и сервисов, являются как раз прокси-чекеры которые поддерживают актуальность данных. На нашем VPS-сервере мы можем довольно просто реализовать функционал такого чекера состоящего из двух компонентов:

    • Опросника, отправляющего запрос на сервер с гарантированно известным ответом
    • И приемника который этот самый ответ и генерирует

    Схема выглядит следующим образом и расположена на одном и том же VPS-сервере:

    Схема работы прокси-чекера

    Консольное приложение выполняет запрос при помощи библиотеки requests с своему-же серверу по определенному URL-гарантирующему однозначный ответ.  Например, при запросе https://help-me-24.com/api/?status_check=True, всегда будет выдаваться JSON ответ:

    {"status": true}

    Таким образом мы сможем определить является ли потенциальный сервер, публичным прокси (так как параметров авторизации мы не передавали) и не вносит ли он изменения в ответ.

    В качестве WEB-приложения у нас используется такой код:

    def Api(request,uri):
        data={'status':'Fail'}
        # Get real IP
        if 'status_check' in request.GET:
            if str(request.GET['status_check'])=='True':
                data={'status':True}
        # Get real IP
        if 'get_my_ip' in request.GET:
            if str(request.GET['get_my_ip'])=='True':
                # HTTP_X_REAL_IP - header
                # REMOTE_ADDR
                ip_address='127.0.0.1'
                try:
                    ip_address=request.META['REMOTE_ADDR']
                except:
                    pass

                try:
                    ip_address=request.META['HTTP_X_REAL_IP']
                except:
                    pass
                data={'ip-address':ip_address}

        return HttpResponse(json.dumps(data), content_type="application/json")

    Дополнительно он позволяет определять ip-адрес клиента для теста на так называемый "высоко анонимный прокси", но от такой практики мы отказались как от совершенно излишней.

    Обратите внимание, что мы используем проверку по https-протоколу. Некоторые proxy-сервера допускают только http-обмен или модифицируют сертификат сервера для перехвата трафика и мы таким образом отсеем этих жуликов.

    Код выполняющий запрос к прокси серверу, соответственно выглядит следующим образом:

    def ProxyChecker(ip,port,time_out=60):
        # Check url
        # curl "http://help-me-24.com/api/?status_check=True"
        # Result {"status": true}
        try:
            proxies = {'http': 'http://'+str(ip)+':'+str(port)+'/'}
            r = requests.get('http://help-me-24.com/api/?status_check=True', timeout=time_out, proxies=proxies)
            r.encoding = 'utf-8'
            res = r.text
        except:
            res = ''
        result = False
        if str(res)=='{"status": true}':
            result = True
        return result

    Сведения о потенциальных прокси-серверах и действующих серверах для повторной проверки хранятся в базе данных и последовательно опрашиваются.

    Неспешным перебором не загружающим минимальный VPS-сервер за 240 рублей в месяц можно актуализировать от 1100 до 1400 прокси в день, а так как этот сервер является еще и сервером где хостится наш сайт, то такого рода сервис становится фактически бесплатным для нас, а в случае если нам удастся продать доступ к спискам прокси по API нескольким пользователям за символическую плату, этот сервис может дополнительно окупить аренду хостинга центрального сайта.

    Статистика обнаружения рабочих прокси-серверов в день

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

    Поиск публичных proxy-серверов

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

    Поиск публичных прокси серверов в нашем случае производится следующим образом:

    1. Пополняется список потенциальных серверов (которые могут быть публичными прокси)
    2. Сервер сканируется на открытые порты
    3. Среди доступных портов выбираются похожие на HTTP/HTTPS-прокси
    4. Выполняется проверка является порт публичным прокси или нет (проверка описана в предыдущем пункте)
    5. В случае если проверка прошла успешно, то активный прокси добавляется в базу данных для последующей периодической проверки (актуализации данных).

    Теперь рассмотрим каждый пункт более детально.

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

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

    Функция для получения случайного ip-адреса используемая в нашей реализации:

    def get_random_ip():
        random_ip=str(random.randrange(1,255))+'.'+str(random.randrange(1,255))+'.'+str(random.randrange(1,255))+'.'+str(random.randrange(1,255))
        return random_ip

    Этот метод напоминает поиск иголки в стоге сена, поэтому гораздо проще для первоначального накопления базы адресов "ограбить" какой ни будь публичный ресурс предоставляющий списки http-прокси.

    Этот метод конечно более эффективный, но большинство сайтов предоставляющие списки публичных прокси защищаются от копирования контента. Например hidemyass использует интересный метод с применением CSS скрывающих части контента и при попытке просто извлечь список IP-адресов со страницы вы получите кашу из некорректных цифр, а браузер при отображении уберет невидимые блоки.

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

            hiders=[]
            for line in site_data.split('\n'):
                if line.count('{display:none}'):
                    hiders.append(line.split('{')[0].split('.')[1])
            site_data = re.sub(re.compile('<span style="display:none".*?/span>'), ' ', site_data)
            site_data = re.sub(re.compile('<div style="display:none".*?/div>'), ' ', site_data)
            for hider in hiders:
                site_data = re.sub(re.compile('<span class="'+hider+'".*?/span>'), ' ', site_data)
                site_data = re.sub(re.compile('<div class="' + hider + '".*?/div>'), ' ', site_data)

    Обработанную страницу передаем функции которая получит из текста все содержащиеся там ip-адреса:

    def extractIPs(fileContent):
        pattern = r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)([ (\[]?(\.|dot)[ )\]]?(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})"
        ips = [each[0] for each in re.findall(pattern, fileContent)]
        for item in ips:
            location = ips.index(item)
            ip = re.sub("[ ()\[\]]", "", item)
            ip = re.sub("dot", ".", ip)
            ips.remove(item)
            ips.insert(location, ip)
        return ips

    Результатом который вернула функция заполняем список ip-адресов являющихся потенциальными прокси и хотя такой метод выглядит не совсем честным по отношению к другим, но он более действенный чем метод "пальцем в небо" который мы рассмотрели ранее.

    Продолжаем раскрывать карты. Чего не хватает, чтобы этот граббер стал по настоящему автономным? Мы решили, что для полноты картины надо заставить его самого искать сайты на которых можно найти списки прокси-серверов. Для этого мы выполняем запросы к поисковой системе и парсим ТОП-10 сайтов по интересующей нас тематике.

    Дополнительно мы внесли в этот метод некотороый элемент неожиданности и вот такой интересный блок у нас получился:

        key_words=['proxy','free','server','list','ru','vpn','http','https','besplatno','best','2017','2016']
        key_words = sorted(key_words, key=lambda x: random.random())[:4]
        key_words = '+'.join(key_words)
        # Multy scan = https://nova.rambler.ru/search?query=proxy+http+list =
        r = requests.get('https://nova.rambler.ru/search?query='+key_words)
        r.encoding = 'utf-8'
        site_data = r.text
        urls=[]
        for item in site_data.split('class="b-serp-item__link" href="'):
            if item.count('<!DOCTYPE html>')==0:
                try:
                    urls.append(item.split('"')[0])
                except:
                    pass

    Хотелось бы конечно обеспечить системе максимальную стабильность и автономность и мы к этому стремимся, но иногда она дает сбои и приходится искать где закралась ошибка.

    Статистика работы локатора

    Представленный выше график демонстрирует как раз работу описанного инструмента. Как вы видите механизм все еще требует доработки и именно поэтому мы не запускаем комплекс в работу.

    И на последок разберемся как из перечня ip-адресов потенциальных открытых прокси-серверов получить рабочие прокси. И это довольно просто, необходимо проверить хост при помощи сканера nmap и передать список подозрительных портов на проверку утилитой тестирования на HTTP/HTTPS-прокси.

    Статистика по числу обнаруженных новых прокси в день 

    Последнее время довольно редко попадаются свежие хосты и адреса так как все, что находится в открытом доступе сканер уже сожрал.

    Теперь свежие поступления составляют 20-50 прокси в день, но этого вполне достаточно так как общая база обнаруженных прокси составляет около шести тысяч штук которые периодически становятся доступными и дают актуализированных данных 1200 хостов в день.


    Обсуждение статьи

    Ваш комментарий: