Подтвердить что ты не робот

Как написать сервер пула прокси (когда приходит запрос, выбрать прокси для получения содержимого url) в python?

Я не знаю, что такое имя для такого прокси-сервера, вы можете исправить свой вопрос.

Когда я ищу прокси-сервер в google, многие реализуют как maproxy или a-python-proxy-in-less-than-100-lines-of-code. Эти серверы прокси, похоже, просто запрашивают удаленный сервер для получения определенного URL-адреса.

Я хочу создать прокси-сервер, который содержит пул прокси (список прокси-серверов http/https) и имеет только один IP-адрес и один порт для обслуживания входящих запросов. Когда запрос поступит, он выберет прокси из пула и выполнит этот запрос и вернет результат.

Например, у меня есть VPS, который IP '192.168.1.66'. Я запускаю прокси-сервер на этом VPS с IP-адресом 127.0.0.1 и порт 8080.

Затем я могу использовать этот прокси, как показано ниже.

import requests
url = 'http://www.google.com'
headers = {
    ...
}
proxies = {
    'http': 'http://192.168.1.66:8080'
}

r = requests.get(url, headers=headers, proxies=proxies)

Я вижу некоторый impelement как:

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)

class ProxyFactory(http.HTTPFactory):
    protocol = proxy.Proxy

reactor.listenTCP(8080, ProxyFactory())
reactor.run()

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

Пример потока:

из hidu/proxy-manager, которые пишут golang.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+ client (want visit http://www.baidu.com/)              +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
                        |  
                        |  via proxy 127.0.0.1:8090  
                        |  
                        V  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+                       +         proxy pool             +  
+ proxy manager listen  ++++++++++++++++++++++++++++++++++  
+ on (127.0.0.1:8090)   +  http_proxy1,http_proxy2,      +  
+                       +  socks5_proxy1,socks5_proxy2   +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
                        |  
                        |  choose one proxy visit 
                        |  www.baidu.com  
                        |  
                        V  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+        site:www.baidu.com                              +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
4b9b3361

Ответ 1

Ваша концепция прокси-пула выполнить не сложно. Если я правильно понимаю, вы хотите сделать следующее.

  • Ваши запросы на прослушивание PROXY SERVER на 192.168.1.66:8080
  • КЛИЕНТ запрашивает доступ http://www.google.com
  • ВАШ ПРОКСИ-СЕРВЕР отправляет запрос КЛИЕНТА НА ДРУГОЙ ПРОКСИ-СЕРВЕР, который находится в списке ДРУГОЙ PROXY SERVER - PROXY POOL.
  • Ваш PROXY SERVER получает ответ от ANOTHER PROXY SERVER и отвечает CLIENT

Итак, я написал простой прокси-сервер, используя Flask и Requests.

from flask import Flask, Response
import random

app = Flask(__name__)

@app.route('/p/<path:url>')
def proxy(url):
    """ Request to this like /p/www.google.com
    """
    url = 'http://{}'.format(url)
    r = get_response(url)

    return Response(stream_with_context(r.iter_content()), 
                    content_type=r.headers['content-type'])

def get_proxy():
    # This is your "Proxy Pool"
    proxies = [
        'http://proxy-server-1.com',
        'http://proxy-server-2.com',
        'http://proxy-server-3.com',
    ]

    return random.choice(proxies)

def get_response(target_url):
    proxy = get_proxy();
    url = "{}/p/{}".format(proxy, target_url)
    # Above line will generate like http://proxy-server-1.com/p/www.google.com

    return requests.get(url, stream=True)

if __name__ == '__main__':
    app.run()

Затем вы можете начать здесь, чтобы улучшить свой прокси-сервер.

Общие Proxy Pool или Proxy Manager могут проверять доступность, скорость и более статистику прокси-серверов и выбирать лучший прокси для отправки запроса. И, конечно, этот пример обрабатывает только простой запрос, и вы можете добавлять функции обрабатывать запросы args, методы, протоколы.

Надеюсь, что это будет полезно!