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

Posted

技术标签:

【中文标题】如何在python中编写代理池服务器(请求来时,选择代理获取url内容)?【英文标题】:How to write a proxy pool server (when a request comes, choose a proxy to get url content) in python? 【发布时间】:2016-01-13 09:21:03 【问题描述】:

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

当我在 google 上搜索代理服务器时,很多实现像 maproxy 或 a-python-proxy-in-less-than-100-lines-of-code。那些代理服务器似乎只是要求远程服务器获取某个 url 地址。

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

例如,我有一个 IP 为“192.168.1.66”的 VPS。我在这个 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)

我看到了一些类似的元素:

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

【问题讨论】:

您是否需要在 python 中进行一些练习,或者您刚刚有一个任务并决定在 python 中实现它?不需要任何编码的开源解决方案可以为您完成任务吗? @ffeast 对于任务或工作我可以只使用squid或goproxy,但是学习一个python工具也很有意义。 你完成任务了吗? 【参考方案1】:

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

    您的代理服务器在 192.168.1.66:8080 上的侦听请求 CLIENT 请求访问http://www.google.com 您的代理服务器将客户的请求发送到另一个代理服务器, 在另一个代理服务器列表中 - 代理池。 您的代理服务器从另一个代理服务器获得响应,并响应客户端

所以,我使用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 PoolProxy Manager 可以检查其代理的可用性、速度和更多统计信息,并选择最佳代理来发送请求。当然,这个例子只处理简单的请求,你可以添加处理请求参数、方法、协议的特性。

希望这有帮助!

【讨论】:

我觉得这种工具不是普通的proxy。因为r = requests.get(url, headers=headers, proxies=proxies)不能用,普通的浏览器(chrome,firefox,ie)也不能用这个proxy。 实际上,您可以使用常用的网络浏览器访问它,例如192.168.1.66:8080/p/www.google.com。是的,上面的示例不是实现普通代理,而是实现一个简单的想法——使用代理的制作代理。 这种方式只是查看结果,而不是使用!我已经描述了有问题的流程,我知道流程,但我不知道如何构建它。你提到的requests已经结束http,不要透明传输数据。代理应该是透明的,比如不关心收入请求是http posthttp get。这些天,我看到所有 python 代理服务器都使用socks。但是他们都没有在另一个代理上使用socks,这是最难的事情。 @mromo 该解决方案预计处理多少并发连接? 老问题觉醒了!所以,@feast 我不知道,但是简单的烧瓶和请求可以在 uwsgi 下处理很多连接。所以如果你有兴趣,你应该检查一下你的环境。

以上是关于如何在python中编写代理池服务器(请求来时,选择代理获取url内容)?的主要内容,如果未能解决你的问题,请参考以下文章

静态Web服务器-返回固定页面数据Python解释器详解实现代理池的API模块

python 如何编写代理服务器

静态Web服务器-返回指定页面数据Python解释器详解实现代理池的API模块

如何使用 nord*** 服务器作为 python 请求的代理?

python 爬虫 ip池怎么做

搭建Python自带静态Web服务器Python解释器详解实现代理池的API模块