如何在python中编写代理池服务器(当出现请求时,选择代理以获取url内容)?

如何在python中编写代理池服务器(当出现请求时,选择代理以获取url内容)?,python,proxy,http-proxy,Python,Proxy,Http Proxy,我不知道这种代理服务器的正确名称,欢迎您修改我的问题标题。 当我在google上搜索代理服务器时,很多实现都像或。这些代理服务器似乎只是要求远程服务器获取特定的url地址。 我想构建一个代理服务器,它包含一个代理池(http/https代理列表),并且只有一个IP地址和一个端口来服务传入的请求。当请求到来时,它将从池中选择一个代理并执行此请求,然后返回结果。 例如,我有一个IP为“192.168.1.66”的VPS。我使用IP“127.0.0.1”和端口“8080”在此VPS上启动代理服务器 然

我不知道这种代理服务器的正确名称,欢迎您修改我的问题标题。

当我在google上搜索代理服务器时,很多实现都像或。这些代理服务器似乎只是要求远程服务器获取特定的url地址。

我想构建一个代理服务器,它包含一个代理池(http/https代理列表),并且只有一个IP地址和一个端口来服务传入的请求。当请求到来时,它将从池中选择一个代理并执行此请求,然后返回结果。

例如,我有一个IP为“192.168.1.66”的VPS。我使用IP“127.0.0.1”和端口“8080”在此VPS上启动代理服务器

然后我可以像下面那样使用这个代理

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

r = requests.get(url, headers=headers, proxies=proxies)
我看到了一些推动因素,如:

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()
它是可行的,但它太简单了,我不知道它是如何工作的,也不知道如何改进代码以使用代理池。

流程示例: 由戈朗撰写的

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+ 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                              +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  

您的代理池概念并不难实现。 如果我理解正确,你想做以下几点

  • 您的代理服务器正在192.168.1.66:8080上侦听请求
  • 客户端请求访问
  • 您的代理服务器将客户端的请求发送到另一个代理服务器, 它位于另一个代理服务器-代理池的列表中
  • 您的代理服务器从另一个代理服务器获取响应,并响应客户端
  • 因此,我使用和编写了简单的代理服务器

    来自烧瓶导入烧瓶,响应
    随机输入
    app=烧瓶(名称)
    @应用程序路径(“/p/”)
    def代理(url):
    “”“向此请求,如/p/www.google.com
    """
    url='http://{}'。格式(url)
    r=获取_响应(url)
    返回响应(带有上下文的流(r.iter\u content()),
    content\u type=r.headers['content-type'])
    def get_proxy():
    #这是您的“代理池”
    代理=[
    'http://proxy-server-1.com',
    'http://proxy-server-2.com',
    'http://proxy-server-3.com',
    ]
    返回随机选择(代理)
    def get_响应(目标_url):
    proxy=get_proxy();
    url=“{}/p/{}”。格式(代理,目标url)
    #上面的行将生成http://proxy-server-1.com/p/www.google.com
    return requests.get(url,stream=True)
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    app.run()
    
    然后,您可以从这里开始改进代理服务器

    公共
    代理池
    代理管理器
    可以检查其代理的可用性、速度和更多统计信息,并选择最佳代理发送请求。当然,这个示例只处理简单的请求,您可以添加处理请求参数、方法和协议的特性


    希望这有帮助

    我认为这种工具不是一个普通的代理。因为我不能通过
    r=requests.get(url,headers=headers,proxies=proxies)
    使用它,而普通的web浏览器(chrome,firefox,ie)也不能使用这个代理。实际上,你可以使用你的普通web浏览器来访问它,比如。是的,上面的示例并不是要实现普通代理,而是要实现一个简单的想法——制作使用代理的代理。这样做只是为了查看结果,而不是使用它!我已经描述了有问题的流程,我知道流程,但我不知道如何构建它。您提到的
    请求
    已过
    http
    ,不能透明地传输数据。代理应该是透明的,例如不关心收入请求是
    http post
    还是
    http get
    。现在,我看到所有python代理服务器都使用
    socks
    。但是他们都没有在另一个代理上使用
    socks
    ,这是最困难的事情。@mromo这个解决方案需要处理多少并发连接?老问题已经被唤醒了!所以,@ffeast我不知道,但在uwsgi下,简单的烧瓶和请求可以处理相当多的连接。所以,如果您感兴趣,您应该检查一下您的环境。您是需要它在python中进行一些实践,还是您刚刚有了一个任务并决定在python中实现它?一个不需要任何编码的开源解决方案能帮你完成任务吗?@ffeast对于任务或工作,我可以使用squid或goproxy,但学习python实现也很有意义。你解决了任务了吗?
    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()